2010-12-01 9 views
148

Modell:Django: Anzeige Auswahlwert

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) 

Auf der Vorlage, wenn ich person.gender nennen, bekomme ich 'M' oder 'F' statt 'Männlich oder weiblich'. Wie wird der Wert ("männlich" oder "weiblich") anstelle des Codes (M/F) angezeigt?

+4

möglich Duplikat [Django Druck Auswahl Wert] (http://stackoverflow.com/questions/ 4274243/django-print-choices-value) –

+0

Ich habe diese Methode versucht, In meiner Vorlage verwende ich: {% für Person in Objektliste%} einige HTML {{person.get_gender_display()}} html {% endfor%} Ich bin Der folgende Fehler wird angezeigt: Ausnahmewert: \t Der Rest konnte nicht analysiert werden: '()' von 'person.get_ gender_display() ' – Shankze

+2

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

Antwort

-50

Ich habe vor kurzem über Django bewegt, also bin ich mehr vertraut mit Jinja2 Templating, aber hier gehen wir:

Beachten Sie, dass es in der Datenbank als ‚M‘ gespeichert und ‚F‘

Psuedo:

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

Aktuell:

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

Für etwas komplizierter mit mehr Auswahl es m Es lohnt sich, etwas Logik zu schreiben, um das CATEGORY_CHOICES Tupel von Tupeln zu durchsuchen. Ab jetzt, mit zwei Wahlmöglichkeiten für das Geschlecht, sehe ich das nicht so.

siehe auch: Django Template Tags

+40

Nein, nicht das. –

+1

ach, sieht aus, als ob es eine Django-Convenience-Funktion dafür gibt. schau dir den Kommentar von oben an. – Devin

+0

Danke Devin. Aber das ist nur ein Beispiel. Ich habe andere Fälle, in denen ich mehr als 6 Auswahlmöglichkeiten habe. Gibt es eine Alternative zu dieser Methode? – Shankze

344

Es sieht aus wie Sie auf dem richtigen Weg waren - get_FOO_display() ist ganz sicher, was Sie wollen:

In Vorlagen, Sie enthalten nicht() im Namen einer Methode . Gehen Sie folgendermaßen vor:

{{ person.get_gender_display }} 
+0

Diese Methode ist unbezahlbar.Aber abgesehen von der Methode, wie kann man den Wert in zB {{i.item.what_to_put_here}} abrufen? – Rexford

+0

Ich verstehe deine Unterfrage nicht. Ist what_to_put_here nur eine Methode für einen Gegenstand? Wenn ja, dann ist Ihre Syntax korrekt. Diese Frage bezieht sich auf die spezifische Situation, in der Optionen in einem Field-Objekt benannt wurden. – jMyles

+7

Nur zu beachten, für jeden, der Jinja2 für ihre Vorlagen verwendet, sollten Sie die Klammern angeben. '{{person.get_gender_display()}}' –

-3

Sie BooleanField statt CharField, und in Modell verwenden können:

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

Beantwortet das die Frage? – DylanYoung

Verwandte Themen