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')?



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

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 }}

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 ()


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.