Django: displaying values ​​of a selected multiple select field in a template

I am trying to find a way to display the text of the selected / starting value of a multiple select field.

My question is similar to this, except that I don't want the value I want to match the text of the variant that matches it:

Display value of django form field in template?

For example, if I had a form with the following:

GENDER_CHOICES = ( ('male', _('Men')), ('female', _('Women')), ) genders = forms.MultipleChoiceField(choices=GENDER_CHOICES, widget=widgets.CheckboxSelectMultiple(), initial=[gender[0] for gender in GENDER_CHOICES]) 

then in my template I can do:

 {{ form.genders.value }} 

to get an array of selected parameters (for example, [u'male ', u'female']. However, I somehow want to look at the string value from the key (for example, "Men", "Women"), something like:

 {% for key in form.genders.value %} {{ form.genders.choices.key }} {% endfor %} 

I can’t find a way to make this work. How can I achieve this with Django 1.3?

ps - This is a brief example, but I need to do this using larger dynamic lists that prohibit the use of multiple if statements (i.e., "if key ==" male "male, etc.)

+7
source share
1 answer
  • Add a method to the form that returns the list you want

  • Call it from the template.

It looks like this:

 def selected_genders_labels(self): return [label for value, label in self.fields['genders'].choices if value in self['genders'].value()] 

In action:

 In [1]: from testapp.views import XForm; f = XForm(initial={'genders': ['male', 'female']}); print f.selected_genders_labels() ['Men', 'Women'] In [2]: from testapp.views import XForm; f = XForm(initial={'genders': ['female']}); print f.selected_genders_labels() ['Women'] In [3]: from testapp.views import XForm; f = XForm(initial={'genders': []}); print f.selected_genders_labels() [] In [4]: from testapp.views import XForm; f = XForm(); print f.selected_genders_labels() ['Men', 'Women'] 

So you can simply repeat like this:

 {% for label in form.selected_genders_labels %}{{ label }}{% endfor %} 

FTR, I used:

 class XForm(forms.Form): GENDER_CHOICES = ( ('male', 'Men'), ('female', 'Women'), ) genders = forms.MultipleChoiceField(choices=GENDER_CHOICES, widget=widgets.CheckboxSelectMultiple(), initial=[gender[0] for gender in GENDER_CHOICES]) def selected_genders_labels(self): return [label for value, label in self.fields['genders'].choices if value in self['genders'].value()] 

You can create a template filter like this:

 @register.filter def selected_labels(form, field): return [label for value, label in form.fields[field].choices if value in form[field].value()] 

Using:

 {% for label in form|selcted_labels:"genders" %} {{ label }} {% endfor %} 
+6
source

All Articles