Django: Seçim Seçim Değeri


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)

Şablonda, aradığımda person.gender, 'M'veya 'F'yerine 'Male'veya alırım 'Female'.

Kod ( / ) yerine değer ( 'Male'veya 'Female') nasıl görüntülenir ?'M''F'



Bu yöntemi denedim, şablonumda kullanıyorum: {% object_list% içindeki kişi için%} bazı html {{person.get_gender_display ()}} html {% endfor%} Aşağıdaki hatayı alıyorum: İstisna Değeri: Ayrıştırılamadı kalan: '()' from 'person.get_gender_display ()'
Shankze

7
Benim Kötü, person.get_gender_display sonra '()' dahil olmamalıydı. Şuan çalışıyor. Teşekkürler.
Shankze

3
Sadece küçük bir yorum, cinsiyet sadece M veya F (1 karakter uzunluğunda) olacağından, charfield'ın maksimum uzunluğunu ayarlamak mantıklı değildir 200. İle max_lenght=1yeterli, sitenizi daha verimli hale getirecek ve yanlış verilere sahip olmayacaksınız sağlayacaktır. :)
Alejandro Garcia

Yanıtlar:


502

Görünüşe göre doğru yoldasınız - get_FOO_display()kesinlikle istediğiniz şey:

Gelen şablonları , sen içermez ()bir yöntemin adına. Aşağıdakileri yapın:

{{ person.get_gender_display }}

Bu yöntem paha biçilemez. Ancak yöntemi kullanmanın yanı sıra, {{i.item.what_to_put_here}} içinde saklanan değeri almanın yolu nedir?
KhoPhi

11
Sadece not etmek için, Jinja2'yi şablonları için kullanan herkes için parantezleri eklemelisiniz. {{ person.get_gender_display() }}
adam b

1
Bonus puanları: bilgilerinizi JSON aracılığıyla gönderiyorsanız (örneğin bir sayfalandırma senaryosunda) bunu yapmanın en iyi yolu nedir? İdeal olarak, Modelleri tek tek başlatmanın ve get_field_display () 'i çağırmanın yükü olmadan
DylanYoung

7
Neredeyse 10 yıl sonra Django'yu sevmeliyim ve cevap hala geçerli! Teşekkürler +1 ve üzerimde iç.
Marc

1
Bir şekilde bu tercüme edilen metni getirmiyor. Eğer i18 zaten web sitesinde uygulanmışsa, çevrilmiş metnin nasıl alınacağı hakkında herhangi bir fikir?
Anoop Nair

16

Seçenekleri ayarlanmış her alan için, nesnenin bir get_FOO_display () yöntemi vardır; burada FOO alanın adıdır. Bu yöntem, alanın “okunabilir” değerini döndürür.

Görünümlerde

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

Şablonda

{{ person.get_gender_display }}

Get_FOO_display () belgeleri


1

Diğerleri, bir get_FOO_display yönteminin ihtiyacınız olduğunu belirtmiştir. Bunu kullanıyorum:

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

belirli bir öğenin öğe türüyle eşleşen öğeyi bulana kadar sahip olduğu tüm seçenekleri yineleyen

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.