2010-05-05 13 views
5

Korzystanie z szablonów Django w Google App Engine (na Pythonie), czy możliwe jest porównanie zmiennej szablonu do liczby całkowitej w bloku {% if %}?Czy mogę porównać zmienną szablonu z liczbą całkowitą w szablonach Django/App Engine?

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

Mój szablon:

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

to wysadza z 'if' statement improperly formatted.

Co ja próbuje zrobić w moim szablonu było zbudować prosty if/Elif/else drzewo być poprawne gramatycznie, aby móc stwierdzić

#foo_count == 0: 
There are no foos. 

#foo_count == 1: 
There is one foo. 

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

Przeglądając dokumenty szablonów Django (this link warunkiem in the GAE documentation wydaje być dla wersji Django znacznie nowszej niż obsługiwana na GAE), wygląda na to, że mogę tylko używać operatorów boolean (jeśli w rzeczywistości operatory boolowskie są obsługiwane w tej starszej wersji Django) z ciągami lub innymi zmiennymi szablonu.

Czy nie można porównywać zmiennych z liczbami całkowitymi lub nie-łańcuchowymi za pomocą szablonów Django?

Jestem pewien, że istnieje prosty sposób obejścia tego - zbudowano ciąg znaków po stronie Pythona, a nie w szablonie - ale wydaje się, że taka prosta operacja powinna być w stanie obsłużyć w szablonie .

Wygląda na to, że powinienem przejść na bardziej zaawansowany mechanizm szablonowania, ale ponieważ jestem nowy w Django (szablony lub jakakolwiek jego część), chciałbym najpierw uzyskać pewne potwierdzenie.

+0

System szablonów webapp pochodzi z Django 0.96; Dokumentacja znajduje się pod adresem http://www.djangoproject.com/documentation/0.96/ Nowsze wersje Django są dostępne w App Engine, ale może być trudno je załadować, jeśli korzystamy z webappa, a nie z całej struktury django. – geoffspear

Odpowiedz

4

Jesteś najprawdopodobniej przy użyciu Django 0,96:

Środowisko App Engine Python obejmuje trzy wersje Django: 0.96, 1.0.2 i 1.1. Django 0.96 jest dołączony do pakietu App Engine SDK, a to wersja, która zostanie zaimportowana domyślnie przez , gdy aplikacja importuje pakiet django .

Źródło: http://code.google.com/appengine/docs/python/tools/libraries.html#Django

Jak xyld powiedział, należy użyć ifequal templatetag, ponieważ boolean operators zostały uwzględnione tylko w wersji 1.2, który jest obecnie w fazie beta.

documentation for version 0.96 can be found here lub można również korzystać z wersji 1.1:

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

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

Oczywiście, zawsze można pobrać cały projekt Django, i umieścić go w głównym katalogu swojej aplikacji. Kilka wskazówek, jak to zrobić, można znaleźć w this article.

EDIT: Ponieważ ifequal nie nadaje się do liczb całkowitych, można przekazać dodatkowe zmienne do szablonu.

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

i w szablonie:

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

czyli

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

Z dokumentacji ifequal: "Możliwe jest tylko porównanie argumentu ze zmiennymi lub ciągami szablonu.".Dlatego brzmi nieodpowiedni do użycia do porównań do liczby całkowitej (aby przetestować długość listy) –

+0

Przepraszamy! Edytowałem swoją odpowiedź – jbochi

1

Django 1.2 pozwala operatorom == w znaczniku {% if %}. Jeśli chcesz porównać dwie liczby całkowite lub inne elementy, zawsze możesz użyć wersji {% ifequal a b %}...{% endifequal %} w starszych wersjach Django.

Domyślam się, że czytasz docs Rozwoju (django 1.2), ale przy użyciu Django 1.1 lub 1.1.1

Jednakże, jeśli trzeba zrobić {{ foo|length }} i porównać wyjścia jako szablon + filtr, nie będziesz w stanie. Będziesz musiał poprawić logikę widoku, aby to obliczyć, abyś mógł użyć go w szablonie.

Ponadto, w zależności od sposobu korzystania z listy, można spojrzeć na for...empty:

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

+0

jest to rodzaj logiki, który zostałby uznany za "zbyt skomplikowany" w jakimkolwiek silniku templatującym Pythona, a nie tylko? Ponieważ wydaje mi się to dość proste - nie jest tak, że próbuję wykonać rzeczywisty kod, tylko kilka instrukcji if. –

+0

jeśli po prostu porównujesz dwa int, jego nie jest skomplikowany, ale starsze Django (pre-1.2, który nie jest jeszcze formalnie wydany), musisz użyć '{% ifequal%}', spróbuj użyć ifequal i zobacz, czy to działa zamiast '{ % 1 == 1%} ' – dlamotte

+0

Obecna wersja rozwojowa docs:" Możliwe jest tylko porównanie argumentu ze zmiennymi lub ciągami szablonu. " –

1

Używasz zmiennej szablonu o nazwie foo_list:

{% if foo_list == 1 %} 

ale nie ma taka zmienna w szablonie, który buduje twój kod, tylko foo i foo_count.

+0

AFAIK, niezdefiniowane vars szablonów są w porządku i po prostu są ignorowane. Dobrze? Przynajmniej nie jest to "błąd składni" ... – dlamotte

+0

Przepraszam, to był błąd literowy spowodowany przez próbę wzięcia prawdziwego kodu i głupiego - pozwól mi to naprawić. –

0

prawej:

{% if foo_list == 1 %} 

źle:

{% if foo_list== 1 %} 
Powiązane problemy