J'ai un modèle:
from django.db import models
CHOICES = (
('s', 'Glorious spam'),
('e', 'Fabulous eggs'),
)
class MealOrder(models.Model):
meal = models.CharField(max_length=8, choices=CHOICES)
J'ai un formulaire:
from django.forms import ModelForm
class MealOrderForm(ModelForm):
class Meta:
model = MealOrder
Et je veux utiliser formtools.preview. Le modèle par défaut imprime la version courte du choix ('e' au lieu de 'Fabulous eggs'), car il utilise
{% for field in form %}
<tr>
<th>{{ field.label }}:</th>
<td>{{ field.data }}</td>
</tr>
{% endfor %}.
Je voudrais un modèle aussi général que celui mentionné, mais imprimant plutôt des «œufs fabuleux».
[comme j'avais des doutes sur la vraie question, je l'ai mise en gras pour nous tous :)]
Je sais comment obtenir la version verbeuse d'un choix d'une manière qui est elle-même moche:
{{ form.meal.field.choices.1.1 }}
La vraie douleur est que j'ai besoin d'obtenir le choix choisi, et le seul moyen qui me vient à l'esprit est d'itérer les choix et les vérifications {% ifequals currentChoice.0 choiceField.data %}
, ce qui est encore plus laid.
Cela peut-il être fait facilement? Ou cela a-t-il besoin d'une programmation de template-tag? Cela ne devrait-il pas déjà être disponible dans django?
la source
La meilleure solution à votre problème est d'utiliser des fonctions d'assistance. Si les choix sont stockés dans la variable CHOICES et que le champ de modèle stockant le choix sélectionné est `` choix '', vous pouvez utiliser directement
dans votre modèle. Ici, x est l'instance du modèle. J'espère que ça aide.
la source
Je m'excuse si cette réponse est redondante avec l'une des listes ci-dessus, mais il semble que celle-ci n'ait pas encore été proposée et qu'elle semble assez claire. Voici comment j'ai résolu ceci:
Ma vue passe un Scoop au modèle (note: pas Scoop.values ()), et le modèle contient:
la source
Sur la base de la réponse de Noah, voici une version à l'abri des champs sans choix:
Je ne sais pas si vous pouvez utiliser un filtre à cette fin. Si quelqu'un a une meilleure solution, je serai heureux de la voir :) Merci Noah!
la source
Nous pouvons étendre la solution de filtrage de Noah pour qu'elle soit plus universelle dans le traitement des données et des types de champs:
Voici le code:
la source
Je ne pense pas qu'il y ait de moyen intégré de faire cela. Un filtre pourrait cependant faire l'affaire:
Ensuite, vous pouvez faire:
la source
Ajoutez à vos models.py une fonction simple:
Maintenant, vous pouvez obtenir la valeur détaillée des champs de choix comme celui-ci:
Upd: Je ne suis pas sûr, est-ce que cette solution «pythonique» et «django-way» est suffisante ou pas, mais ça marche. :)
la source
Vous avez Model.get_FOO_display () où FOO est le nom du champ qui a des choix.
Dans votre modèle, procédez comme suit:
la source