2012-04-03 80 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?

PS - 这是一个简短的例子,但我需要禁止使用多个更大的动态列表做if语句(即“如果key ==‘男’‘男人’......等”)

+1

这很可能是这样的:'{%关键在form.genders.value%} {{form.genders.get_key_display}} {%endfor%}'但我不确定。 – Mig 2012-04-03 13:33:12

回答

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 2012-04-03 14:08:21

+1

你应该做一个模板过滤器,而不是更容易。 – jpic 2012-04-03 14:09:45

+0

好的,我会去的。谢谢 – John 2012-04-03 14:13:02