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.