问题 Django:如何根据实际值和选择访问模板中ChoiceField的显示值?


我有一个绑定形式的ChoiceField,其选择是:

[('all', 'All users'), ('group', 'Selected groups'), ('none', 'None')]

在模板中,我可以访问其绑定值(要存储的实际值;每个元组的第一个元素)和选项。有了这些信息,我知道我应该能够访问显示值,或者每个元组的第二个元素。但是我怎么能在模板中做到这一点?谢谢。


8348
2017-12-08 01:20


起源

这是一个笑,我甚至尝试循环选择并使用模板中的方括号访问元素。当然,这不起作用。愚蠢的我! - tamakisquare
如果你有类似的东西 foo = ['a', {'b': 'c'}] 你在模板中访问它的方式是 foo.1.b 即你可以使用带有Django模板的点符号的方括号访问某些内容。但是,如果没有某种自定义过滤器,则无法使用变量来指定索引 {% with foo|index:my_variable as this_choice %}this_choice.b{% endwith %} 相反,它会变得非常混乱,因此您可以使用更专业的过滤器或在视图中准备数据。由于这个问题很老,我相信你现在已经很清楚了。 - Kit Sunde


答案:


我怀疑没有自定义模板标签或过滤器就可以完成。 自定义模板过滤器看起来:

@register.filter
def selected_choice(form, field_name):
    return dict(form.fields[field_name].choices)[form.data[field_name]]

12
2017-12-08 08:30



如果有的话,我会把这个问题留给另外一天挖掘其他解决方案。 - tamakisquare
谢谢。经过几个小时的研究解决问题,我认为自定义模板标签是我最好的选择。 - tamakisquare
我用了: return form.fields[field_name].queryset.get(pk=form[field_name].value())  该 form 迭代在使用queryset =初始化的formset时调用变量,并且其self.data返回{}。这个解决方案来自于 Django IRC日志,解决了这个问题。 - conorsch
为了避免许多数据库命中,我使用了: return dict(form.fields[field_name].choices).get(form.initial.get(field_name, None), None) - Isaac C.


使用 get_FOO_display属性

**编辑**

Oups!阅读下面的评论后,快速编辑此答案。

bound_form['field'].value()

应该管用 根据这个变化集


4
2017-12-08 10:39



这是一个 模型领域 属性,但ChoiceField是一个 表格字段,所以这不是一个可行的解决方案。 - tamakisquare
实际上,有人早些时候发布了相同的答案并将其删除了。 - tamakisquare


检查此链接 - https://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.get_FOO_display

您可以使用此函数返回显示名称 - ObjectName.get_FieldName_display()

将ObjectName替换为您的类名和FieldName,其字段需要获取显示名称。


0
2018-03-05 21:36



你的答案适用于 模型 领域,但问题是关于 形成 字段,所以这不是一个解决方案。 - tamakisquare
更不用说,当时Thibault J已经提供了相同的答案,我也回答了同样的问题。 - tamakisquare


我有一个联系表格使用 FormView 基于类的视图。联系表格有一些 ChoiceField 领域。我没有将提交内容存储在数据库中;只需通过电子邮件发送给网站所有者。这就是我最终做的事情:

def form_valid(self, form):
    for field in form.fields:
        if hasattr(form[field].field, 'choices'):
            form.cleaned_data[field + '_value'] = dict(form[field].field.choices)[form.cleaned_data[field]]

    ...

0
2018-03-06 18:28





如果你使用 {{ form.instance.field }} 在表单模板中,它应显示所选的选择显示名称


0
2018-01-22 18:02



真?它不起作用 - FeedTheWeb