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?

Shankze
quelle
4
Mögliches Duplikat des Django-Druckauswahlwerts
Ignacio Vazquez-Abrams
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
Mögliches Duplikat von Django-Vorlagen: ausführliche Version einer Auswahl
Ciro Santilli 法轮功 冠状 病 六四 事件 15

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

Muhammad Faizan Fareed
quelle
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

Daniel O'Brien
quelle