134 votes

Modèles de Django : version verbeuse d’un choix

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.l'aperçu. Le modèle par défaut imprime la version courte du choix ("e" au lieu de "Fabuleux œufs"), car il utilise

{% for field in form %}
<tr>
<th>{{ field.label }}:</th>
<td>{{ field.data }}</td>
</tr>
{% endfor %}.

Je voudrais un modèle plus général de la cité, mais l'impression de "Fabuleux oeufs" à la place.

[comme j'ai eu des doutes, où est la vraie question, j'ai mis en caractères gras pour nous tous :)]

Je sais comment obtenir la version détaillé d'un choix dans une manière qui est lui-même laid:

{{ form.meal.field.choices.1.1 }}

La vraie douleur est j'ai besoin pour obtenir le choix sélectionné, et la seule façon de venir à mon esprit, est une itération par le biais de choix et de vérification de l' {% ifequals currentChoice.0 choiceField.data %}, ce qui est encore plus laide.

Peut-il être fait facilement? Ou elle a besoin de quelques modèles de la balise de la programmation? Ne pourrait-il pas être disponibles dans django déjà?

270voto

Roberto Liffredo Points 15265

Dans les modèles Django, vous pouvez utiliser le bouton "get_FOO_display()" la méthode, qui sera de retour le lisible alias pour le terrain, où les " FOO " est le nom du champ.

Remarque: dans le cas de la norme FormPreview modèles ne sont pas à l'utiliser, alors vous pouvez toujours fournir vos propres modèles pour que la forme, qui contiendra quelque chose comme {{ form.get_meal_display }}.

60voto

Reema Points 211

La meilleure solution pour votre problème est d’utiliser des fonctions d’assistance. Si les choix sont stockés dans la variable de choix et le champ de modèle ranger le choix sélectionné est «choix» alors vous pouvez directement utiliser

dans votre modèle. Ici, x est l’instance de modèle. Elle pourra être qu'utile.

52voto

Dan Kerchner Points 31

Toutes mes excuses si cette réponse est redondante avec n’importe quel énumérés ci-dessus, mais il semble que celui-ci n’a pas été offert encore, et il semble assez propre. Voici comment j’ai résolu ceci :

A mon avis passe un Scoop au modèle (note : pas Scoop.values()) et le modèle contient :

10voto

Artur Gajowy Points 523

Se basant sur la réponse de l’arche de Noé, voici une version insensible aux champs sans choix :

Je ne sais pas c’est OK pour utiliser un filtre pour un tel but. Si quelqu'un a une meilleure solution, je serai heureux de le voir  :) Merci Noah !

7voto

Ivan Kharlamov Points 1037

Nous pouvons étendre la solution de filtrage de Noah pour qu’elle soit plus universelle dans le traitement des types de données et de champs:

 <table>
{% for item in query %}
    <tr>
        {% for field in fields %}
            <td>{{item|human_readable:field}}</td>
        {% endfor %}
    </tr>
{% endfor %}
</table>
 

Voici le code:

 #app_name/templatetags/custom_tags.py
def human_readable(value, arg):
    if hasattr(value, 'get_' + str(arg) + '_display'):
        return getattr(value, 'get_%s_display' % arg)()
    elif hasattr(value, str(arg)):
        if callable(getattr(value, str(arg))):
            return getattr(value, arg)()
        else:
            return getattr(value, arg)
   else:
       try:
           return value[arg]
       except KeyError:
           return settings.TEMPLATE_STRING_IF_INVALID
register.filter('human_readable', human_readable)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X