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. enter image description here

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

Popular posts from this blog

What is happening when Matlab is starting a "parallel pool"? -

angular - DownloadURL return null in below code -

php - Cannot override Laravel Spark authentication with own implementation -