Django templates: verbose version of a choice

django, django-forms, django-templates

Solution

In Django templates you can use the "`get_FOO_display()`" method, that will return the readable alias for the field, where 'FOO' is the name of the field.

Note: in case the standard `FormPreview` templates are not using it, then you can always provide your own templates for that form, which will contain something like `{{ form.get_meal_display }}`.

Problem

I have a model: ``` from django.db import models CHOICES = ( ('s', 'Glorious spam'), ('e', 'Fabulous eggs'), ) class MealOrder(models.Model): meal = models.CharField(max_length=8, choices=CHOICES) ``` I have a form: ``` from django.forms import ModelForm class MealOrderForm(ModelForm): class Meta: model = MealOrder ``` And I want to use formtools.preview. The default template prints the short version of the choice ('e' instead of 'Fabulous eggs'), becuase it uses ``` {% for field in form %} <tr> <th>{{ field.label }}:</th> <td>{{ field.data }}</td> </tr> {% endfor %}. ``` I'd like a template as general as the mentioned, but printing 'Fabulous eggs' instead. [as I had doubts where's the real question, I bolded it for all of us :)] I know how to get the verbose version of a choice in a way that is itself ugly: ``` {{ form.meal.field.choices.1.1 }} ``` The real pain is I need to get the selected choice, and the only way coming to my mind is iterating through choices and checking `{% ifequals currentChoice.0 choiceField.data %}`, which is even uglier. Can it be done easily? Or it needs some template-tag programming? Shouldn't that be available in django already?

Original source