Django:如何在给定实际值和选项的情况下访问模板中 ChoiceField 的显示值?
Posted
技术标签:
【中文标题】Django:如何在给定实际值和选项的情况下访问模板中 ChoiceField 的显示值?【英文标题】:Django: How to access the display value of a ChoiceField in template given the actual value and the choices? 【发布时间】:2012-01-15 12:51:07 【问题描述】:我有一个绑定形式的 ChoiceField,它的选择是:
[('all', 'All users'), ('group', 'Selected groups'), ('none', 'None')]
在模板中,我可以毫无问题地访问它的绑定值(要存储的实际值;每个元组的第一个元素)和选项。有了这些信息,我知道我应该能够访问显示值,或者每个元组的第二个元素。但是我怎样才能在模板中做到这一点?谢谢。
【问题讨论】:
这是一个笑话,我什至尝试循环选择并使用模板中的方括号访问其中的元素。当然,那没有用。愚蠢的我! 如果你有foo = ['a', 'b': 'c']
这样的东西,你在模板中访问它的方式是 foo.1.b
即你可以使用方括号和 Django 模板所具有的点符号来访问一些东西。但是,如果没有某种自定义过滤器(例如 % with foo|index:my_variable as this_choice %this_choice.b% endwith %
),您不能使用变量来指定索引,这反而会变得非常混乱,因此您最好使用更专业的过滤器或在视图中准备数据。由于这个问题已经很老了,我相信你现在已经很清楚了。
【参考方案1】:
我怀疑它可以在没有自定义模板标签或过滤器的情况下完成。 自定义模板过滤器可能看起来:
@register.filter
def selected_choice(form, field_name):
return dict(form.fields[field_name].choices)[form.data[field_name]]
【讨论】:
我将把这个问题留到另一天,以便挖掘其他解决方案(如果有的话)。 谢谢。经过数小时的研究以解决问题,我认为自定义模板标签是我最好的选择。 我使用过:return form.fields[field_name].queryset.get(pk=form[field_name].value())
form
变量在迭代使用 queryset= 初始化的表单集时被调用,并且它的 self.data 返回 。这个解决方案,来自Django IRC logs,解决了这个问题。
为了避免很多数据库命中,我使用了:return dict(form.fields[field_name].choices).get(form.initial.get(field_name, None), None)
【参考方案2】:
使用get_FOO_display property。
** 编辑 **
哎呀!阅读下面的 cmets 后快速编辑此答案。
bound_form['field'].value()
应该可以according to this changeset
【讨论】:
这是一个 Model 字段 属性,但 ChoiceField 是一个 Form 字段,所以这不是一个可行的解决方案。 确实,之前有人发布了相同的答案,他删除了它。【参考方案3】:检查此链接 - https://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.get_FOO_display
您可以使用此函数返回显示名称 - ObjectName.get_FieldName_display()
将 ObjectName 替换为您的类名,将 FieldName 替换为您需要获取其显示名称的字段。
【讨论】:
您的答案适用于 Model 字段,但问题是关于 Form 字段,因此这不是解决方案。 更不用说,Thibault J 不久前已经提供了相同的答案,我也做出了同样的回应。【参考方案4】:我有一个使用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]]
...
【讨论】:
【参考方案5】:如果您在表单模板中使用 form.instance.field
,它应该显示选择的选项显示名称
【讨论】:
【参考方案6】:由于使用了“union”方法而无法使用 get_FOO_display(因为它返回的是字典,而不是对象列表)。我写了一个快速模板标签来转换字段显示。
@register.simple_tag
def tag_get_display(obj):
"""
Returns the display of the field when unable to access get_foo_display.
"""
return CHOICES_LIST[obj][1]
【讨论】:
以上是关于Django:如何在给定实际值和选项的情况下访问模板中 ChoiceField 的显示值?的主要内容,如果未能解决你的问题,请参考以下文章
Android:如何在给定网址的情况下显示大型动画 gif?