Django: Nilai Pilihan Tampilan

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)

Pada template, ketika saya menelepon person.gender, saya mendapatkan 'M'atau 'F'bukannya 'Male'atau 'Female'.

Bagaimana cara menampilkan nilai ( 'Male'atau 'Female') alih-alih kode ( 'M'/ 'F')?

Shankze
sumber
4
kemungkinan duplikat dari nilai pilihan cetak Django
Ignacio Vazquez-Abrams
Saya mencoba metode ini, Dalam templat saya, saya menggunakan: {% untuk orang di object_list%} html {{person.get_gender_display ()}} html {% endfor%} Saya mendapatkan kesalahan berikut: Nilai Pengecualian: Tidak dapat menguraikan sisanya: '()' dari 'person.get_gender_display ()'
Shankze
7
Buruk saya, saya seharusnya tidak menyertakan '()' setelah person.get_gender_display. Ini bekerja sekarang. Terima kasih.
Shankze
3
Hanya sedikit komentar, karena jenis kelamin hanya akan menjadi M atau F (panjang 1 karakter), tidak masuk akal untuk menetapkan panjang maksimal charfield 200. Dengan max_lenght=1cukup, akan membuat situs Anda lebih efisien dan Anda akan memastikan bahwa Anda tidak akan memiliki data yang salah. :)
Alejandro Garcia
Kemungkinan duplikat template Django: versi verbose pilihan
Ciro Santilli 郝海东 冠状 病 六四 六四 事件

Jawaban:

503

Sepertinya Anda berada di jalur yang benar - get_FOO_display()pasti yang Anda inginkan:

Di template , Anda tidak memasukkan ()nama metode. Lakukan hal berikut:

{{ person.get_gender_display }}
jMyles
sumber
Metode ini sangat berharga. Tetapi selain menggunakan metode, apa cara untuk mengambil nilai yang disimpan dalam katakanlah, {{i.item.what_to_put_here}}?
KhoPhi
11
Sebagai catatan, bagi siapa saja yang menggunakan Jinja2 untuk templatnya, Anda harus menyertakan tanda kurung. {{ person.get_gender_display() }}
adam b
1
Poin bonus: apa cara terbaik untuk melakukan ini jika Anda mengirim informasi Anda melalui JSON (misalnya dalam skenario pagination)? Idealnya tanpa overhead instantiating Model satu per satu dan memanggil get_field_display ().
DylanYoung
7
Harus cinta Django, hampir 10 tahun kemudian dan jawabannya masih valid! Terima kasih +1 dan minumlah pada saya.
Marc
1
Entah bagaimana ini tidak mengambil teks yang diterjemahkan. Adakah ide tentang cara mendapatkan teks yang diterjemahkan jika i18 sudah diterapkan di situs web?
Anoop Nair
16

Untuk setiap bidang yang memiliki pilihan yang ditetapkan, objek akan memiliki metode get_FOO_display (), di mana FOO adalah nama bidang tersebut. Metode ini mengembalikan nilai bidang yang “dapat dibaca manusia”.

Dalam Tampilan

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

Dalam Templat

{{ person.get_gender_display }}

Dokumentasi get_FOO_display ()

Muhammad Faizan Fareed
sumber
1

Orang lain telah menunjukkan bahwa metode get_FOO_display adalah yang Anda butuhkan. Saya menggunakan ini:

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

yang mengulangi semua pilihan yang dimiliki item tertentu sampai menemukan yang cocok dengan jenis item

Daniel O'Brien
sumber