python - How to access to the model through a ModelMultipleChoiceField -
i have manytomany field in model called 'games' :
class team(models.model): name = models.charfield(max_length=15, null=false) tag = models.charfield(max_length=4, null=false) description = htmlfield(blank=true, null=true) logo = models.filefield(upload_to=user_directory_path, validators=[validate_file_extension], blank=true, null=true) games = models.manytomanyfield(games, verbose_name="jeu", null=false) owner = models.foreignkey(user, verbose_name="créateur") date = models.datetimefield(auto_now_add=true, auto_now=false, verbose_name="date de création") update = models.datetimefield(auto_now=true, verbose_name="dernière modification") def __str__(self): return self.name i feed model form :
class teamform(forms.modelform): game = games.objects.all() games = forms.modelmultiplechoicefield(widget=forms.checkboxselectmultiple, required=true, queryset=game) logo = forms.imagefield(required=false, widget=forms.fileinput) class meta: model = team fields = ('name', 'tag', 'description', 'logo', 'games' ) in other model 'games', have field 'logo'. can show :
class games(models.model): guid = models.charfield(max_length=100, unique=true, null=false, verbose_name="guid") title = models.charfield(max_length=100, null=false, verbose_name="titre") logo = models.filefield(upload_to='media/games/', validators=[validate_file_extension], blank=true, null=true, verbose_name="logo du jeu") date = models.datetimefield(auto_now_add=true, auto_now=false, verbose_name="date de création") update = models.datetimefield(auto_now=true, verbose_name="dernière modification") def __str__(self): return self.title so, in template can render manytomany field calling {{form.games}}. works fine, have lots of checkbox next name of games.
now, make more cool, want display logo of game. problem modelmultiplechoicefield return game.id , game.title. returns tuple default.
so blocked...
if have idea, or if had same issue, please give me solution.
many thanks
for more details, add views.py , template :
def view_team_index(request, id_team): if request.user.is_authenticated(): media = settings.media try: team = team.objects.get(id=id_team) if team.owner == request.user: owner = true except: messages.add_message(request, messages.info, 'désolé, cette équipe est inconnue.') return redirect(view_wall) if request.method == 'post': #modifier les champs de bases if 'request_base' in request.post: request_base = true form = teamform(instance=team.objects.get(owner=request.user)) if 'edit_base' in request.post: form = teamform(request.post, request.files, instance=team.objects.get(owner=request.user)) if form.is_valid(): form.save() #modifier la description if 'request_description' in request.post: request_description = true form = teamform() if 'edit_description' in request.post: form = teamform(request.post) return render(request, 'team_index.html', locals()) else: messages.add_message(request, messages.info, 'vous devez être connecté pour accéder à cette page.') return redirect(view_logon) template :
<div class="w3-row-padding margin_bottom_10"> <div class="w3-col m12"> <div class="w3-card-2 w3-round w3-white"> <div class="w3-container w3-padding container"> <div class="text_align_center"> <div><img src="{{media}}{{team.logo|default:"media/images/avatar-default-blue.png"}}" class="w3-circle logo_team" alt="logo"></div> <form method="post" action="" enctype="multipart/form-data"> {% csrf_token %} <hr> {{form.logo}} <hr> <h4>{{form.name}}</h4> {{form.tag}} <hr> <div class="list">{{form.games}}</div> <hr> <input type="submit" value="sauvegarder" name="edit_base" class="w3-button w3-theme-d2 w3-margin-bottom"> </form> </div> </div> </div> </div> </div> i tried override choice field, have error :
games = forms.gameschoicefield(widget=forms.checkboxselectmultiple, required=true, queryset=game) attributeerror: module 'django.forms' has no attribute 'gameschoicefield' this tried :
from django.forms import modelmultiplechoicefield class gameschoicefield(modelmultiplechoicefield): def label_from_instance(self, obj): logo = '<img src="{url}"/>'.format(url=obj.logo.url) return "{title} {logo}".format(title=obj.title, logo=logo) class teamform(forms.modelform): game = games.objects.all() games = forms.gameschoicefield(widget=forms.checkboxselectmultiple, required=true, queryset=game) logo = forms.imagefield(required=false, widget=forms.fileinput) class meta: model = team fields = ('name', 'tag', 'description', 'logo', 'games' ) let's see current working situation. want add games.logo next each checkbox. 
you can try override modelmultiplechoicefield
from django.forms import modelmultiplechoicefield class gameschoicefield(modelmultiplechoicefield): def label_from_instance(self, obj): logo = '<img src="{url}"/>'.format(url=obj.logo.url) return "{title} {logo}".format(title=obj.title, logo=logo) class teamform(forms.modelform): game = games.objects.all() games = gameschoicefield(widget=forms.checkboxselectmultiple, required=true, queryset=game) more details fields-which-handle-relationships
hope help
extra info replace
games = forms.gameschoicefield # ^^^^ to
games = gameschoicefield # ^^^^
Comments
Post a Comment