【问题标题】:Django: Display values of the selected multiple choice field in a templateDjango:在模板中显示选定的多项选择字段的值
【发布时间】:2012-04-17 03:31:37
【问题描述】:

我正在尝试找到一种方法来显示多选字段的选定/初始值的文本。

我的问题类似于这个问题,除了我不想要 value 我想要它对应的选项文本:

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']。但是,我想从键中查找字符串值(即“Men”,“Women”),一些喜欢:

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

我找不到使这项工作的方法。如何使用 Django 1.3 实现这一点?

ps - 这是一个简短的示例,但我需要使用更大的动态列表来禁止使用多个 if 语句(即“if key == 'male' 'Men' ... etc”)

【问题讨论】:

  • 这可能类似于:{% for key in form.genders.value %} {{ form.genders.get_key_display }} {% endfor %} 但我也不确定。

标签: python django django-forms


【解决方案1】:
  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|selected_labels:"genders" %}
    {{ label }}
{% endfor %}

【讨论】:

  • 感谢您的回复。有什么办法可以把它变成模板标签之类的吗?我有很多字段需要这样做,并且真的不希望每个字段都有一个方法...
  • 你应该做一个模板过滤器,它更容易。
  • 更新了模板过滤器示例。
猜你喜欢
  • 2019-05-29
  • 1970-01-01
  • 2012-07-05
  • 2021-12-11
  • 2018-12-30
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多