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 的显示值?的主要内容,如果未能解决你的问题,请参考以下文章

Django forms select默认值和选中值的展示

Django:访问给定字段的选择元组

Django:访问给定字段的选择元组

Android:如何在给定网址的情况下显示大型动画 gif?

如何在不知道子类名称的情况下访问 django 中对象的子类?

如何在给定row和col索引的情况下获取Dojo Grid单元的实际DOM节点?