Django: valeur de choix d'affichage


246

models.py:

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, lorsque j'appelle person.gender, j'obtiens 'M'ou 'F'au lieu de 'Male'ou 'Female'.

Comment afficher la valeur ( 'Male'ou 'Female') au lieu du code ( 'M'/ 'F')?



J'ai essayé cette méthode, dans mon modèle j'utilise: {% pour la personne dans la liste d'objets%} certains html {{person.get_gender_display ()}} html {% endfor%} J'obtiens l'erreur suivante: Valeur d'exception: impossible d'analyser le reste: '()' de 'person.get_gender_display ()'
Shankze

7
Mon mauvais, je n'aurais pas dû inclure «()» après person.get_gender_display. Ça marche maintenant. Merci.
Shankze

3
Juste un petit commentaire, puisque le genre ne sera que M ou F (longueur de 1 caractère), cela n'a aucun sens de définir la longueur maximale du champ de caractères sur 200. Avec max_lenght=1est suffisant, rendra votre site plus efficace et vous garantira que vous n'aurez pas de mauvaises données. :)
Alejandro Garcia

Réponses:


503

Il semble que vous étiez sur la bonne voie - get_FOO_display()c'est certainement ce que vous voulez:

Dans les modèles , vous n'incluez pas ()le nom d'une méthode. Procédez comme suit:

{{ person.get_gender_display }}

Cette méthode n'a pas de prix. Mais en dehors de l'utilisation de la méthode, quelle est la façon de récupérer la valeur stockée dans disons {{i.item.what_to_put_here}}?
KhoPhi

11
Juste pour noter, pour toute personne utilisant Jinja2 pour leurs modèles, vous devez inclure les parenthèses. {{ person.get_gender_display() }}
adam b

1
Points bonus: quelle est la meilleure façon de procéder si vous envoyez vos informations via JSON (par exemple dans un scénario de pagination)? Idéalement sans la surcharge d'instancier les modèles un par un et d'appeler get_field_display ().
DylanYoung

7
Faut aimer Django, presque 10 ans plus tard et la réponse est toujours valable! Thx +1 et bois sur moi.
Marc

1
D'une manière ou d'une autre, cela ne récupère pas le texte traduit. Une idée sur la façon d'obtenir le texte traduit si i18 est déjà implémenté sur le site Web?
Anoop Nair

16

Pour chaque champ pour lequel des choix sont définis, l'objet aura une méthode get_FOO_display (), où FOO est le nom du champ. Cette méthode renvoie la valeur «lisible par l'homme» du champ.

Dans les vues

person = Person.objects.filter(to_be_listed=True)
context['gender'] = person.get_gender_display()

Dans le modèle

{{ person.get_gender_display }}

Documentation de get_FOO_display ()


1

D'autres ont souligné qu'une méthode get_FOO_display est ce dont vous avez besoin. J'utilise ceci:

def get_type(self):
    return [i[1] for i in Item._meta.get_field('type').choices if i[0] == self.type][0]

qui répète tous les choix d'un élément particulier jusqu'à ce qu'il trouve celui qui correspond au type d'élément

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.