【问题标题】:How to get the label of a choice in a Django forms ChoiceField?如何在 Django 表单 ChoiceField 中获取选项标签?
【发布时间】:2010-10-20 04:31:08
【问题描述】:

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

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

form.cleaned_data["reason"] 只会给我“功能”或“订单”左右。

【问题讨论】:

  • 我认为您可能需要重新考虑哪个答案是公认的答案..
  • @Dan:为什么?你更喜欢哪一个?
  • @webjunkie 得票最多的那个是更以 django 为中心的那个,它需要在每个模型的基础上编写更少的代码。
  • @JackM。如果您的意思是@shacker,它实际上并没有回答问题。 get_FOO_display 适用于 django.db.models.ChoiceField,而不是 django.forms.ChoiceField。我相信,目前接受的答案(由 Andrés 提出)是 Django 1.5 中最好的答案。
  • 接受的答案也适用于更多情况。例如,如果您查询FOO 表,但想要dict 而不是模型(使用FOO.objects.values()),它会进行微小的调整。 @shacker 的回答仅适用于成熟的模型。

标签: python django choicefield


【解决方案1】:

你可以有这样的表格:

#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"]]

【讨论】:

    【解决方案2】:

    好的。我知道这是非常旧帖,但阅读它对我有很大帮助。而且我想我还有点要补充的。

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

    ObjectName.get_FieldName_display()
    

    不适用于表单。

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

    这里有一些可能对你有帮助的代码。

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

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

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

    【讨论】:

    • 知道如何在模板中显示给定选项的显示值吗? IE。 {{form.get_fieldchoice_display}} 好像不行
    • 上面有我的答案,而且后面的帖子中还有很多有效的答案。所有选项都供您选择,如果您想要一个具体的答案,然后发布您的实际代码,我们可以给您具体的答案,很高兴这样做。
    【解决方案3】:

    我正在使用@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。 希望对您有所帮助

    【讨论】:

      【解决方案4】:

      这是最简单的方法:Model instance reference: Model.get_FOO_display()

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

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

      【讨论】:

      • NB 您在回答中提到“模型”的次数 (3) 以及 @webjunkie 在问题中提到它的次数 (0)。
      • chosen_label = form.instance.get_FOO_display() 正在工作中
      【解决方案5】:

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

      chosen_label = form.instance.get_FOO_display()
      

      【讨论】:

      • 这只适用于ModelForm,问题没有提到。
      【解决方案6】:

      这可能会有所帮助:

      reason = form.cleaned_data['reason']
      reason = dict(form.fields['reason'].choices)[reason]
      

      【讨论】:

      【解决方案7】:

      我认为@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()
      

      【讨论】:

        【解决方案8】:

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

        ContactForm.get_reason_display()
        

        在模板中,像这样使用:

        {{ OBJNAME.get_FIELDNAME_display }}
        

        【讨论】:

        • 但它不是模型,它是一种形式。
        • 是的。这仅适用于 Django 模型。表单不模仿这种行为(尽管现在我希望他们这样做)......
        • 这非常适合模型。谢谢你的提示。我想它仍然需要对表单进行不同的处理。
        • 有同样的问题,但ModelForm。因此,{{form.instance.get_FIELDNAME_display}} 对我来说就像魅力一样。
        【解决方案9】:

        这是我想出的一种方法。可能有更简单的方法。我使用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,但它演示了可以在哪里找到您需要的数据。

        【讨论】:

        • 如果这种东西现在是核心的一部分,有什么消息吗?不可思议的是,这不在表单 API 中,但我很难在谷歌上搜索更好的解决方案。
        猜你喜欢
        • 2014-02-24
        • 1970-01-01
        • 2013-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多