Django: Auswahlwert anzeigen


245

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)

Wenn ich auf der Vorlage anrufe person.gender, erhalte ich 'M'oder 'F'anstelle von 'Male'oder 'Female'.

Wie zeige ich den Wert ( 'Male'oder 'Female') anstelle des Codes ( 'M'/ 'F') an?



Ich habe diese Methode ausprobiert. In meiner Vorlage verwende ich: {% für Person in Objektliste%} etwas HTML {{person.get_gender_display ()}} HTML {% endfor%} Ich erhalte die folgende Fehlermeldung: Ausnahmewert: Konnte nicht analysiert werden der Rest: '()' von 'person.get_gender_display ()'
— Shankze

7
Mein schlechtes, ich hätte '()' nach person.get_gender_display nicht einfügen sollen. Es funktioniert jetzt. Vielen Dank.
— Shankze

3
Nur ein kleiner Kommentar, da das Geschlecht nur M oder F (1 Zeichen Länge) sein wird, macht es keinen Sinn, die maximale Länge des Zeichenfelds auf einzustellen 200. Mit max_lenght=1ist genug, wird Ihre Website effizienter und Sie werden sicherstellen, dass Sie keine falschen Daten haben. :)
— Alejandro Garcia

Antworten:


502

Es sieht so aus, als wären Sie auf dem richtigen Weg - get_FOO_display()ist mit Sicherheit das, was Sie wollen:

In Vorlagen wird ()der Name einer Methode nicht berücksichtigt. Mach Folgendes:

{{ person.get_gender_display }}

Diese Methode ist von unschätzbarem Wert. Aber wie kann man, abgesehen von der Methode, den in beispielsweise {{i.item.what_to_put_here}} gespeicherten Wert abrufen?
— KhoPhi

11
Für alle, die Jinja2 für ihre Vorlagen verwenden, sollten Sie die Klammern einfügen. {{ person.get_gender_display() }}
— Adam B

1
Bonuspunkte: Wie geht das am besten, wenn Sie Ihre Informationen über JSON senden (z. B. in einem Paginierungsszenario)? Idealerweise ohne den Aufwand, die Modelle einzeln zu instanziieren und get_field_display () aufzurufen.
— DylanYoung

7
Ich muss Django lieben, fast 10 Jahre später und die Antwort ist immer noch gültig! Danke +1 und trink auf mich.
— Marc

1
Irgendwie wird der übersetzte Text dadurch nicht abgerufen. Haben Sie eine Idee, wie Sie den übersetzten Text erhalten, wenn i18 bereits auf der Website implementiert ist?
— Anoop Nair

16

Für jedes Feld, für das Auswahlmöglichkeiten festgelegt sind, verfügt das Objekt über eine Methode get_FOO_display (), wobei FOO der Name des Felds ist. Diese Methode gibt den vom Menschen lesbaren Wert des Feldes zurück.

In Ansichten

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

In der Vorlage

{{ person.get_gender_display }}

Dokumentation von get_FOO_display ()


1

Andere haben darauf hingewiesen, dass Sie eine get_FOO_display-Methode benötigen. Ich benutze dies:

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

Dies durchläuft alle Auswahlmöglichkeiten, die ein bestimmtes Element hat, bis es diejenige findet, die dem Elementtyp entspricht

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.