2012-04-03 2 views
7

Я пытаюсь найти способ отображения текста выбранного/начального значения поля множественного выбора.Django: отображает значения выбранного поля множественного выбора в шаблоне

Мой вопрос похож на этот, за исключением я не хочу, значениеЯ хочу текст опции он соответствует:

Display value of a django form field in a template?

Например, если бы я имел форму со следующим :

GENDER_CHOICES = (
    ('male', _('Men')), 
    ('female', _('Women')), 
) 

genders = forms.MultipleChoiceField(choices=GENDER_CHOICES, 
    widget=widgets.CheckboxSelectMultiple(), 
    initial=[gender[0] for gender in GENDER_CHOICES]) 

то в моем шаблоне, я могу сделать:

{{ form.genders.value }} 

, чтобы получить массив выбранных опций (т. [u'male ', u'female']. Тем не менее, я как-то хочу посмотреть значение строки из ключа (то есть «Мужчины», «Женщины»), что-то вроде:

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

я не могу найти способ сделать эту работу. Как я могу достичь этого, используя Django 1.3?

пс - Это короткий пример, но мне нужно сделать это с большими динамическими списками, которые запрещают использование мультипликатора, если заявления (например, «если ключевым ==„мужской“„Мужчины“... и т.д.»)

+1

Это, вероятно, может быть что-то вроде: '{% для ключа в form.genders.value%} {{}} form.genders.get_key_display {% endfor%} 'Но я тоже не уверен. – Mig

ответ

6
  1. Добавить метод в форме, которая возвращает список, который вы хотите

  2. Вызывается из шаблона

Это выглядит следующим образом:

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

В действии:

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'] 

Таким образом, вы можете просто итерацию, как это:

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

FTR, я использовал:

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()] 

Вы можете добиться успеха га шаблон фильтра:

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

Использование:

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

Спасибо за ваш ответ. Есть ли способ превратить это в тег шаблона или что-то еще? У меня довольно много полей, в которых мне нужно это сделать, и мне не нужен метод в поле ... – John

+1

Вместо этого вы должны создать фильтр шаблонов, это намного проще. – jpic

+0

OK Я пойду. Спасибо – John

Смежные вопросы