Tengo un modelo:
from django.db import models
CHOICES = (
('s', 'Glorious spam'),
('e', 'Fabulous eggs'),
)
class MealOrder(models.Model):
meal = models.CharField(max_length=8, choices=CHOICES)
Tengo un formulario:
from django.forms import ModelForm
class MealOrderForm(ModelForm):
class Meta:
model = MealOrder
Y quiero usar formtools.preview. La plantilla predeterminada imprime la versión corta de la opción ('e' en lugar de 'Huevos fabulosos'), porque usa
{% for field in form %}
<tr>
<th>{{ field.label }}:</th>
<td>{{ field.data }}</td>
</tr>
{% endfor %}.
Me gustaría una plantilla tan general como la mencionada, pero imprimiendo 'Huevos fabulosos' en su lugar.
[Como tenía dudas de dónde está la verdadera pregunta, la en negrita para todos nosotros :)]
Sé cómo obtener la versión detallada de una elección de una manera fea:
{{ form.meal.field.choices.1.1 }}
El verdadero dolor es que necesito obtener la opción seleccionada, y la única forma de recordar es iterar a través de las elecciones y la verificación {% ifequals currentChoice.0 choiceField.data %}
, lo que es aún más feo.
¿Se puede hacer fácilmente? ¿O necesita alguna programación de etiqueta de plantilla? ¿No debería ya estar disponible en django?
fuente
La mejor solución para su problema es usar funciones auxiliares. Si las opciones se almacenan en las OPCIONES variables y el campo del modelo que almacena la opción seleccionada es ' opciones ', puede usar directamente
en tu plantilla Aquí, x es la instancia del modelo. Espero eso ayude.
fuente
Mis disculpas si esta respuesta es redundante con cualquiera de las enumeradas anteriormente, pero parece que aún no se ha ofrecido, y parece bastante limpia. Así es como he resuelto esto:
Mi vista pasa un Scoop a la plantilla (nota: no Scoop.values ()), y la plantilla contiene:
fuente
Basándonos en la respuesta de Noah, aquí hay una versión inmune a los campos sin opciones:
No estoy seguro de si está bien usar un filtro para tal fin. Si alguien tiene una solución mejor, me alegrará verla :) ¡Gracias Noah!
fuente
Podemos extender la solución de filtro de Noah para que sea más universal al tratar con datos y tipos de campo:
Aquí está el código:
fuente
No creo que haya una forma integrada de hacerlo. Sin embargo, un filtro podría hacer el truco:
Entonces puedes hacer:
fuente
Agregue a sus modelos.py una función simple:
Ahora, puede obtener un valor detallado de los campos de elección como ese:
Upd .: No estoy seguro, es esa solución "pitónica" y "django-way" suficiente o no, pero funciona. :)
fuente
Tiene Model.get_FOO_display () donde FOO es el nombre del campo que tiene opciones.
En su plantilla haga esto:
fuente