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')?

Shankze
la source
4
doublon possible de la valeur des choix d'impression
Ignacio Vazquez-Abrams
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
Copie possible des modèles Django: version détaillée d'un choix
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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 }}
jMyles
la source
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 ()

Muhammad Faizan Fareed
la source
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

Daniel O'Brien
la source