2011-07-09 8 views
27

Ben django için oldukça yeni, ama java dünyasında kodlamada uzun yıllar deneyimim var, bu yüzden bu soruyu sormaktan kendimi çok üzgün hissediyorum - Cevabın açık ve eminim Sadece onu özlüyorum. Bunu google'da veya başka bir yerde sorgulamak için doğru yolu bulamıyorum. Django dokümanlarını aradım ya da yok ya da göremiyorum. Tek istediğim, şablon boşsa VEYA boş bir dize VEYA sadece bir grup boşluk değilse şablon testinde. Alanımın alanlara sokulduğu bir sorunum var - başka bir konuya ihtiyacım var ve yapacak, ama ... mantığımın işe yaramasını istiyorum. Şu anda, dizgemde sadece bunu yaptığınız alanlar olduğu için: {% lesson.assignment%}, istemediğim halde her zaman geçiyor. {%%} Arasında çalışacak bir trim tipi işlev aradım, ancak bir şey bulamıyorum. Strip'i denedim, ancak {%%} arasında çalışmıyor. Birisi bana cevap yönüne işaret edebilir mi ... özlediğim bazı dokümanlar ... bir şey mi?Python Django Şablonlar ve bir değişken boş olup olmadığını test etme

Teşekkür bir ton önceden!

cevap

44
{% if lesson.assignment and lesson.assignment.strip %} 

.strip aramalar str.strip() yüzden biz ayıklamak, boş olarak boşluk yalnızca dizeleri işleyebilir None çalıştığını

Belgesi (.strip() yöntemi olmazdı olan) ilk (./manage.py shell cinsinden):

>>> import django 
>>> from django.template import Template, Context 
>>> t = Template("{% if x and x.strip %}OK{% else %}Empty{% endif %}") 
>>> t.render(Context({"x": "ola"})) 
u'OK' 
>>> t.render(Context({"x": " "})) 
u'Empty' 
>>> t.render(Context({"x": ""})) 
u'Empty' 
>>> t.render(Context({"x": None})) 
u'Empty' 
+0

@ PaulP1975: Bunu kaçırmış olabilirsiniz çünkü 've' bir 'if' kullanarak Django'ya yeni bir eklentidir. –

1

Tüm boşlukları kaldırmak için cut filter kullanarak benzetim yapabilirsiniz. Ama muhtemelen ilk etapta neden tüm boşlukları içerdiğini öğrenmelisin.

+0

Evet, bütün yeri vardır gerçeği düzeltmek niyetinde. Ancak, her iki şekilde çalışmasını istedim ve şerit işlevinin işe yaramasını istemedim (yukarıda Shawn'ın kodu işe yaradı). – PaulP1975

0

Django şablon değişkeninde herhangi bir yerde yerleşik herhangi bir yöntemi arayabilirsiniz. Örneğin, Python dize yöntemi strip'u çağırabilirsiniz. Yani bu çalışacaktır: lesson.assignment bir modeli alandır

{% if lesson.assignment.strip %} 
+0

Sorun: 'CharField' NULLs'a izin veriyor, bu nedenle NULL alanı 'Yok' bir' strip' yöntemine sahip olmadığı için bir istisna oluşturacaktır. –

+0

Neden bilmiyorum, ama bunu yapmaya çalıştığımda ilk kez başarısız oldu ... Olağanüstü duruma (null) vurabilirdim ... Hatırlayamıyorum. – PaulP1975

5

varsa, modeliniz bir yardım edicinin ve kullandığınızda:

class Lesson(models.Model): 
    assignment = models.CharField(..., null=True, ...) 
    # ... 

    @property 
    def has_assignment(self): 
     return self.assignment is not None and self.assignment.strip() != "" 

Sonra şablonunda {% if lesson.has_assignment %} kullanın. Bir önceki onay emin olur ise

+0

Bu ilginç bir seçenek ... Şablondaki mantığı nasıl temizlediğini çok seviyorum. Python ve django için çok yeni, bu yüzden hala ipleri öğreniyorum. Bu öneri için teşekkür ederiz! – PaulP1975

5

soru gönderilmiş, bu mevcut olmayabilir ama bir seçenek şablon filtresi default_if_none inşa (kullanıyor olabilir). Örneğin

: {{ lesson.assignment|default_if_none:"Empty" }}

İlgili konular