2010-12-01 6 views
148

Modèle:Django: Afficher Choix Valeur

class Person(models.Model): 
    name = models.CharField(max_length=200) 
    CATEGORY_CHOICES = (
      ('M','Male'), 
      ('F','Female'), 
      ) 
    gender = models.CharField(max_length=200, choices = CATEGORY_CHOICES) 
    to_be_listed = models.BooleanField(default=True) 
    description = models.CharField(max_length=20000, blank=True) 

views.py:

def index(request): 
    latest_person_list2 = Person.objects.filter(to_be_listed=True) 
    return object_list(request, template_name='polls/schol.html',queryset=latest_person_list, paginate_by=5) 

Sur le modèle, quand je l'appelle person.gender, je suis 'M' ou 'F' au lieu de 'Masculin ou féminin'. Comment afficher la valeur ('Homme' ou 'Femme') à la place du code (H/F)?

+4

double possible de [valeur choix d'impression Django] (http://stackoverflow.com/questions/ 4274243/django-print-choices-value) –

+0

J'ai essayé cette méthode, Dans mon modèle j'utilise: {% pour personne dans object_list%} du HTML {{person.get_gender_display()}} html {% endfor%} Je suis obtenir l'erreur suivante: Valeur d'exception: \t Impossible d'analyser le reste: '()' de 'person.get_ gender_display() ' – Shankze

+2

Ma Mauvaise, je n'aurais pas dû inclure'() 'après person.get_gender_display. Ça marche maintenant. Merci. – Shankze

Répondre

-50

J'ai récemment déménagé au-delà de Django, donc je suis plus familier avec Jinja2 templating, mais ici on y va:

Notez qu'il est stocké dans la base de données « M » et « F »

Psuedo:

# Iterate through list of people 
    # Check if male 
    # output span w/ gender 

Actual:

{% for person in latest_person_list2 %} 
{% if person.gender == 'M' %} 
    <span>Male</span> 
{% else %} 
    <span>Female</span> 
{% endif %} 
{% endfor %} 

Pour quelque chose de plus complexe avec plus de choix il m Il vaudrait la peine d'écrire une logique pour chercher dans le tuple CATEGORY_CHOICES des tuples. A partir de maintenant, avec deux choix pour le genre, je ne vois pas que ce soit le cas.

voir aussi: Django Template Tags

+40

Non, pas ça. –

+1

hélas, il semble qu'il y ait une fonction de commodité django pour cela. Consultez le commentaire ci-dessus. – Devin

+0

Merci Devin. Mais ce n'est qu'un exemple. J'ai d'autres cas où j'ai plus de 6 choix. Y a-t-il une alternative à cette méthode? – Shankze

344

On dirait que vous étiez sur la bonne voie - get_FOO_display() est certainement ce que vous voulez:

Dans les modèles, vous ne comprennent pas() au nom d'une méthode . Effectuez les opérations suivantes:

{{ person.get_gender_display }} 
+0

Cette méthode n'a pas de prix.Mais mis à part l'utilisation de la méthode, comment récupérer la valeur stockée dans say, {{i.item.what_to_put_here}}? – Rexford

+0

Je ne comprends pas votre sous-question. Est-ce que what_to_put_here est juste une méthode sur item? Si c'est le cas, votre syntaxe est correcte. Cette question sur la situation spécifique d'avoir des choix nommés dans un objet Field. – jMyles

+7

Juste pour noter, pour quiconque utilise Jinja2 pour leurs modèles, vous devez inclure les parenthèses. '{{person.get_gender_display()}}' –

-3

vous pouvez utiliser BooleanField au lieu de CharField, et dans le modèle:

BOOL_CHOICES = ((True, 'Male'), (False, 'Female')) 
gender = models.BooleanField(choices=BOOL_CHOICES) 
+3

Est-ce que cela répond à la question? – DylanYoung

Questions connexes