Django: Wyświetl wartość wyboru

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)

Na szablonie, kiedy dzwonię person.gender, dostaję 'M'lub 'F'zamiast 'Male'lub 'Female'.

Jak wyświetlić wartość ( 'Male'lub 'Female') zamiast kodu ( 'M'/ 'F')?

Shankze
źródło
4
możliwy duplikat wartości opcji drukowania Django
Ignacio Vazquez-Abrams
Próbowałem tej metody, w moim szablonie używam: {% dla osoby w object_list%} trochę HTML {{person.get_gender_display ()}} HTML {% endfor%} Otrzymuję następujący błąd: Wartość wyjątku: Nie można przeanalizować reszta: „()” od „person.get_gender_display ()”
Shankze
7
Mój Zły, nie powinienem uwzględniać „()” po person.get_gender_display. Już działa. Dzięki.
Shankze,
3
Mały komentarz, ponieważ płeć będzie miała postać M lub F (długość 1 znaku), nie ma sensu ustawiać maksymalnej długości pola znaków na 200. Dzięki max_lenght=1wystarczy, sprawi, że Twoja strona będzie bardziej wydajna i zapewni, że nie będziesz mieć złych danych. :)
Alejandro Garcia
Możliwe duplikaty szablonów Django: pełna wersja do wyboru
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

502

Wygląda na to, że byłeś na dobrej drodze - get_FOO_display()to z pewnością to, czego chcesz:

W szablonach nie podajesz ()nazwy metody. Wykonaj następujące czynności:

{{ person.get_gender_display }}
jMyles
źródło
Ta metoda jest bezcenna. Ale poza tą metodą, w jaki sposób można odzyskać wartość zapisaną np. {{I.item.what_to_put_here}}?
KhoPhi 18.04.15
11
Dla przypomnienia, dla każdego, kto używa Jinja2 do swoich szablonów, należy dołączyć nawiasy. {{ person.get_gender_display() }}
adam b
1
Punkty bonusowe: jak najlepiej to zrobić, jeśli wysyłasz swoje informacje przez JSON (na przykład w scenariuszu paginacji)? Idealnie bez narzutu tworzenia modeli jeden po drugim i wywoływania get_field_display ().
DylanYoung
7
Uwielbiam Django, prawie 10 lat później, a odpowiedź jest nadal aktualna! Dzięki +1 i wypij na mnie.
Marc
1
Jakoś to nie pobiera przetłumaczonego tekstu. Masz pomysł, jak uzyskać przetłumaczony tekst, jeśli i18 jest już zaimplementowany na stronie?
Anoop Nair
16

Dla każdego pola z ustawionymi opcjami obiekt będzie miał metodę get_FOO_display (), gdzie FOO jest nazwą pola. Ta metoda zwraca wartość pola „czytelną dla człowieka”.

W widokach

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

W szablonie

{{ person.get_gender_display }}

Dokumentacja get_FOO_display ()

Muhammad Faizan Fareed
źródło
1

Inni zauważyli, że potrzebujesz metody get_FOO_display. Używam tego:

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

który iteruje wszystkie opcje, które ma dany element, dopóki nie znajdzie tego, który pasuje do typu elementów

Daniel O'Brien
źródło