Как получить метку выбора в Django forms ChoiceField?
У меня есть выбор, теперь, как мне получить "ярлык", когда он мне нужен?
class ContactForm(forms.Form):
reason = forms.ChoiceField(choices=[("feature", "A feature"),
("order", "An order")],
widget=forms.RadioSelect)
form.cleaned_data["reason"]
даст мне только "функцию" или "порядок" или около того.
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
С полем, из которого нужно извлечь отображаемое имя.
вот способ, который я придумал. Возможно, есть более простой способ. Я протестировал его с помощью 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()