簡體   English   中英

如何在 Django 表單 ChoiceField 中獲取選項標簽?

[英]How to get the label of a choice in a Django forms ChoiceField?

我有一個ChoiceField ,現在如何在需要時獲取標簽

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

form.cleaned_data["reason"]只給我featureorder左右。

請參閱Model.get_FOO_display()上的文檔。 所以,應該是這樣的:

ContactForm.get_reason_display()

在模板中,像這樣使用:

{{ OBJNAME.get_FIELDNAME_display }}

這可能會有所幫助:

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

這是最簡單的方法: 模型實例參考:Model.get_FOO_display()

您可以使用此函數將返回顯示名稱: ObjectName.get_FieldName_display()

ObjectName替換為您的類名,將FieldName替換為您需要獲取其顯示名稱的字段。

如果表單實例已綁定,則可以使用

chosen_label = form.instance.get_FOO_display()

這是我想出的一種方法。 可能有更簡單的方法。 我使用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,但它演示了在哪里可以找到您需要的數據。

你可以有這樣的表格:

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

好的。 我知道這是老的帖子,但閱讀它對我有很大幫助。 我想我有一些要補充的。

這里的症結在於模型方法。

ObjectName.get_FieldName_display()

不適用於表格。

如果您有一個不基於模型的表單並且該表單具有選擇字段,那么您如何獲得給定選擇的顯示值。

這是一些可能對您有所幫助的代碼。

您可以使用此代碼從已發布的表單中獲取選擇字段的顯示值。

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

'int' 是基於選擇的選擇是一個整數。 如果選擇索引是一個字符串,那么您只需刪除 int(...)

我使用@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 希望這有幫助

我想也許@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()

確認 Ardi 和 Paul 的響應最適合形式而不是模型。 將 Ardi 推廣到任何參數:

    class AnyForm(forms.Form):
        def get_field_name_display(self, field_name):
            return dict(self.fields[field_name].choices[self.cleaned_data[field_name]]

或者將此方法放在一個單獨的類中,並在您的表單中對其進行子類化

class ChoiceFieldDisplayMixin:
    def get_field_name_display(self, field_name):
        return dict(self.fields[field_name].choices[self.cleaned_data[field_name]]


class AnyCustomForm(forms.Form, ChoiceFieldDisplayMixin):
    choice_field_form = forms.ChoiceField(choices=[...])

現在為任何選擇字段調用相同的方法:

form_instance = AnyCustomForm()
form_instance.is_valid()
form_instance.get_field_name_display('choice_field_form')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM