71

我有一个ChoiceField,现在如何在需要时获得标签?

class ContactForm(forms.Form):
     reason = forms.ChoiceField(choices=[("feature", "A feature"),
                                         ("order", "An order")],
                                widget=forms.RadioSelect)

form.cleaned_data["reason"]只给我featureororder 左右。

4

9 回答 9

147

请参阅Model.get_FOO_display()上的文档。所以,应该是这样的:

ContactForm.get_reason_display()

在模板中,像这样使用:

{{ OBJNAME.get_FIELDNAME_display }}
于 2009-04-18T03:28:26.147 回答
87

这可能会有所帮助:

reason = form.cleaned_data['reason']
reason = dict(form.fields['reason'].choices)[reason]
于 2011-09-29T17:14:51.320 回答
24

这是最简单的方法:模型实例参考:Model.get_FOO_display()

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

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

于 2012-03-05T21:40:16.783 回答
9

如果表单实例已绑定,则可以使用

chosen_label = form.instance.get_FOO_display()
于 2012-04-07T02:18:21.143 回答
4

这是我想出的一种方法。可能有更简单的方法。我使用以下方法对其进行了测试python manage.py shell

>>> cf = ContactForm({'reason': 'feature'})
>>> cf.is_valid()
True
>>> cf.fields['reason'].choices
[('feature', 'A feature')]
>>> for val in cf.fields['reason'].choices:
...     if val[0] == cf.cleaned_data['reason']:
...             print val[1]
...             break
...
A feature

注意:这可能不是很 Pythonic,但它演示了在哪里可以找到您需要的数据。

于 2009-04-17T20:06:40.827 回答
3

你可以有这样的表格:

#forms.py
CHOICES = [('feature', "A feature"), ("order", "An order")]
class ContactForm(forms.Form):
     reason = forms.ChoiceField(choices=CHOICES,
                                widget=forms.RadioSelect)

那么这会给你你想要的:

reason = dict(CHOICES)[form.cleaned_data["reason"]]
于 2012-05-09T11:20:24.367 回答
2

好的。我知道这是老的帖子,但阅读它对我有很大帮助。我想我有一些要补充的。

这里的症结在于模型方法。

ObjectName.get_FieldName_display()

不适用于表格。

如果您有一个不基于模型的表单并且该表单具有选择字段,那么您如何获得给定选择的显示值。

这是一些可能对您有所帮助的代码。

您可以使用此代码从已发布的表单中获取选择字段的显示值。

display_of_choice = dict(dateform.fields['fieldnane'].choices)[int(request.POST.get('fieldname'))]

'int' 是基于选择的选择是一个整数。如果选择索引是一个字符串,那么您只需删除 int(...)

于 2020-03-23T01:07:21.530 回答
1

我使用@Andrés Torres Marroquín 的方式,我想分享我的实现。

GOOD_CATEGORY_CHOICES = (
    ('paper', 'this is paper'),
    ('glass', 'this is glass'),
    ...
)

class Good(models.Model):
    ...
    good_category = models.CharField(max_length=255, null=True, blank=False)
    ....

class GoodForm(ModelForm):
    class Meta:
        model = Good
        ...

    good_category = forms.ChoiceField(required=True, choices=GOOD_CATEGORY_CHOICES)
    ...


    def clean_good_category(self):
        value = self.cleaned_data.get('good_category')

        return dict(self.fields['good_category'].choices)[value]

结果是this is paper而不是paper。希望这有帮助

于 2019-02-26T09:48:12.907 回答
0

我想也许@webjunkie 是对的。

如果您正在从 POST 中读取表单,那么您会这样做

def contact_view(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            contact = form.save()
            contact.reason = form.cleaned_data['reason']
            contact.save()
于 2010-10-25T22:57:07.377 回答