2010-05-05 9 views
5

Google App Engine'de (Python'da) Django şablonlarını kullanarak, bir şablon değişkenini {% if %} bloğundaki bir tamsayı ile karşılaştırmak mümkün mü?Şablon değişkenini Django/App Engine şablonlarında bir tam sayı ile karşılaştırabilir miyim?

views.py:

class MyHandler(webapp.RequestHandler): 
    def get(self): 
     foo_list = db.GqlQuery(...) 
     ... 
     template_values['foos'] = foo_list 
     template_values['foo_count'] = len(foo_list) 
     handler.response.out.write(template.render(...)) 

Benim şablonu:

{% if foo_count == 1 %} 
    There is one foo. 
{% endif %} 

Bu 'if' statement improperly formatted ile havaya uçuruyor.

Ne Şablonumdaki yapmak için uğraş/elif/else ağaç Django şablon belgelerini tarama

#foo_count == 0: 
There are no foos. 

#foo_count == 1: 
There is one foo. 

#else: 
There are {{ foos|length }} foos. 

devlet edebilmek için dilbilgisi açısından doğru olmasını ise basit inşa idi (this linkin the GAE documentation görünüyor sağlanan Django sürümleri, GAE'de desteklenenden çok daha yeni olabilir), aslında yalnızca boole işleçlerini kullanabiliyormuşum gibi görünüyor (aslında boole operatörleri Django'nun bu eski sürümünde destekleniyorsa) dizeleri veya diğer şablon değişkenleri ile.

Django şablonlarıyla değişkenleri tamsayılara veya dizeleri karşılaştırmak mümkün mü?

Geçici çözüm için kolay bir yol olduğundan eminim - şablon içinde değil de Python tarafında ileti dizesini oluşturuyor - ancak bu, şablonda işlenebilmesi gereken basit bir işlem gibi görünüyor .

Daha gelişmiş bir şablonlama motoruna geçmem gerekiyormuş gibi geliyor, fakat Django'ya (şablonlar veya herhangi bir parçası) yeni olduğum için, önce bir onay isterim.

+0

Webapp şablon sistemi Django 0.96'dan gelir; belgeler http://www.djangoproject.com/documentation/0.96/ Django'nun daha yeni sürümleri App Engine'de bulunabilir, ancak tüm django çerçevesinden ziyade webapp kullanırken yüklenenlerin yüklenmesi zor olabilir. – geoffspear

cevap

4

En büyük olasılıkla Django 0.96 kullanıyorsanız: 0:

App Engine Python ortam Django üç sürümleri içerir.96, 1.0.2 ve 1.1. Django 0.96, App Engine SDK'sı ile birlikte gelir ve , bir uygulama django paketini içe aktardığında varsayılan olarak tarafından içe aktarılan sürümdür.

Kaynak: xyld belirttiği gibi boolean operators yalnızca sürüm 1.2 dahil edildi, çünkü, ifequal templatetag kullanmalıdır http://code.google.com/appengine/docs/python/tools/libraries.html#Django

, o şu anda beta.

documentation for version 0.96 can be found here ya da sürüm 1.1 kullanabilirsiniz:

import os 
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 

from google.appengine.dist import use_library 
use_library('django', '1.1') 

Elbette, her zaman uygulamanın üst düzey dizininde tüm Django projesini indirebilir ve içerebilir. Bunun nasıl yapılacağı ile ilgili bazı ipuçları, this article'da bulunabilir.

EDIT: ifequal tam sayılar için uygun olmadığından, şablonunuza ek değişkenler iletebilirsiniz.

{% if one_foo %} 
    You have one foo. 
{% endif %} 

ya:

{% if foo_list %} 
    You have {{ foo_count }} foo{{foo_count|pluralize}}. 
{% else %} 
    You have no foos 
{% endif %} 
+0

ifequal dokümantasyonundan: "Bir argümanı sadece şablon değişkenleri veya dizgilerle karşılaştırmak mümkündür."Bu nedenle bir tamsayıya karşılaştırmak için uygun değildir (bir listenin uzunluğunu test etmek için) –

+0

Üzgünüz! Cevabımı düzenledim – jbochi

1

Django 1.2, {% if %} etiketinde == işleçleri için izin verir. İki tam sayı veya başka bir öğeyi karşılaştırmanız gerekirse, her zaman Django'nun eski sürümlerinde {% ifequal a b %}...{% endifequal %}'u kullanabilirsiniz.

Benim tahminim Geliştirme docs (1.2 django) okuma, ancak {{ foo|length }} yapmak ve bu şablon etiketinin çıktısını karşılaştırmak gerekirse,

Ancak django 1.1 veya 1.1.1 kullanarak olmasıdır + Filtre, mümkün olmayacak. Bunu sizin için hesaplamak için görünüm mantığınızı düzeltmeniz gerekir, böylece bunu şablonda kullanabilirsiniz.

Ayrıca, listesini kullanarak nasıl bağlı olarak, for...empty içine bakabilirsiniz:

http://docs.djangoproject.com/en/dev/ref/templates/builtins/#for-empty

+0

, sadece Python şablonlama motorunda "çok karmaşık" kabul edilen mantık tipidir. Çünkü bu benim için oldukça basit görünüyor - gerçek kodları çalıştırmaya çalışıyorum sanki değil, sadece birkaç tane deyim varsa. –

+0

sadece iki kareyi karşılaştırıyorsanız, karmaşık değil, ancak eski Django'ları (henüz resmi olarak yayınlanmamış 1.2 öncesi), "{% ifequal%}" işlevini kullanmalı, ifequal kullanmayı deneyin ve bunun yerine çalışıp çalışmadığını görün. { % 1 == 1%} – dlamotte

+0

Mevcut geliştirme sürümü docs durumu "Bu yalnızca bir argümanı şablon değişkenleri veya dizeleri ile karşılaştırmak mümkündür." –

1

Sen adında bir şablon değişkenini foo_list kullanıyorsanız:

{% if foo_list == 1 %} 

ama hiç yok kodunuzdaki şablondaki bu değişken sadece foo ve foo_count.

+0

AFAIK, tanımlanmamış şablon vars'ları tamamdır ve göz ardı edilir. Sağ? En azından, onun bir 'sözdizimi hatası '... – dlamotte

+0

üzgünüm, bu gerçek kod almaya çalışıyorum neden bir yazım hatası oldu ve aptal - bana bunu düzelteyim. –

0

sağ:

{% if foo_list == 1 %} 

yanlış:

class MyHandler(webapp.RequestHandler): 
    def get(self): 
     foo_list = db.GqlQuery(...) 
     ... 
     template_values['foos'] = foo_list 
     template_values['foo_count'] = len(foo_list) 
     template_values['one_foo'] = len(foo_list) == 1 
     handler.response.out.write(template.render(...)) 

ve şablonda

{% if foo_list== 1 %} 
İlgili konular