Как получить метку выбора в поле выбора форм Django?


У меня есть ChoiceField, теперь как мне получить "ярлык", когда мне это нужно?

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

form.cleaned_data["reason"] дал бы мне только "функцию" или "порядок" или так.

7 52

7 ответов:

Это может помочь:

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

посмотреть документы на - модели.get_FOO_display (). Так, должно быть что-то вроде :

ContactForm.get_reason_display()

в шаблоне используйте вот так:

{{ OBJNAME.get_FIELDNAME_display }}

Это самый простой способ сделать это: ссылка на экземпляр модели: Модель.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"]]

Я думаю, может быть, @webjunkie прав.

Если Вы читаете из формы из сообщения, то вы бы сделали

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()