tipos personalizados formularios form ejemplos avanzados python django choicefield

python - personalizados - model forms django



¿Cómo obtener la etiqueta de una elección en un formulario de Django ChoiceField? (7)

Aquí hay una manera en que se me ocurrió. Puede haber una manera más fácil. Lo probé usando 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

Nota: Probablemente no sea muy pitónico, pero demuestra dónde se pueden encontrar los datos que necesita.

Tengo un ChoiceField, ahora ¿cómo obtengo la "etiqueta" cuando la necesito?

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

form.cleaned_data["reason"] solo me daría "feature" u "order" más o menos.


Creo que tal vez @webjunkie tiene razón.

Si estás leyendo el formulario de un POST, entonces harías

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


Esta es la forma más fácil de hacerlo: referencia de instancia del modelo: Model.get_FOO_display ()

Puede usar esta función que devolverá el nombre para mostrar: ObjectName.get_FieldName_display()

Reemplace ObjectName con su nombre de clase y FieldName con el campo del cual necesita recuperar el nombre para mostrar.


Esto puede ayudar:

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


Puedes tener tu formulario así:

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

Entonces esto te daría lo que quieres:

reason = dict(CHOICES)[form.cleaned_data["reason"]]


Si la instancia del formulario está vinculada, puede usar

chosen_label = form.instance.get_FOO_display()


Vea los documentos en Model.get_FOO_display() . Entonces, debería ser algo como:

ContactForm.get_reason_display()

En una plantilla, usa así:

{{ OBJNAME.get_FIELDNAME_display }}