Используя шаблоны Django в Google App Engine (на Python), это возможный сравнить переменную шаблона с целым числом в {% if %}
блок?
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(...))
Мой шаблон:
{% if foo_count == 1 %}
There is one foo.
{% endif %}
Это аварийно завершается с 'if' statement improperly formatted
.
То, что я пытался сделать в своем шаблоне, было сборкой простое if/elif/else дерево, чтобы быть грамматически корректным, чтобы смочь указать
#foo_count == 0:
There are no foos.
#foo_count == 1:
There is one foo.
#else:
There are {{ foos|length }} foos.
При просмотре шаблонных документов Django (эта ссылка, предоставленная в документации GAE, кажется, для версий Django, намного более нового, чем, что поддерживается на GAE), появляется, как будто я могу только на самом деле использовать булевы операторы (если на самом деле булевы операторы поддерживаются в этой более старой версии Django) со строками или другими переменными шаблона.
Разве не возможно сравнить переменные с целыми числами или нестроками с шаблонами Django?
Я уверен, что существует простой способ к обходному решению, это - создало строку сообщения на стороне Python, а не в шаблоне - но это походит на такую простую операцию, которую необходимо смочь обработать в шаблоне.
Это кажется, что я должен переключаться на более усовершенствованный механизм шаблонной обработки, но поскольку я плохо знаком с Django (шаблоны или любая часть его), я был бы точно так же, как некоторое подтверждение сначала.
Вы, скорее всего, используете Django 0.96 :
Среда Python для App Engine включает три версии Django: 0.96, 1.0.2 и 1.1. Django 0.96 включен в SDK App Engine, а - это версия, которая импортируется по умолчанию , когда приложение импортирует пакет django .
Источник: http://code.google.com/appengine/docs/python/tools/libraries.html#Django
Как сказал xyld, вы должны использовать ifequal
templatetag, потому что логические операторы были включены только в версию 1.2, которая в настоящее время находится в стадии бета-тестирования.
Документацию для версии 0.96 можно найти здесь , или вы также можете использовать версию 1.1:
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from google.appengine.dist import use_library
use_library('django', '1.1')
Конечно, вы всегда можете загрузить весь проект Django и включить его в каталог верхнего уровня вашего приложения. . Некоторые советы о том, как это сделать, можно найти в этой статье .
РЕДАКТИРОВАТЬ : Поскольку ifequal
не подходит для целых чисел, вы можете передать дополнительные переменные в свой шаблон.
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(...))
и в шаблоне:
{% if one_foo %}
You have one foo.
{% endif %}
или:
{% if foo_list %}
You have {{ foo_count }} foo{{foo_count|pluralize}}.
{% else %}
You have no foos
{% endif %}
Django 1.2 позволяет использовать операторы ==
в теге {% if %}
. Если вам нужно сравнить два целых числа или другие элементы, вы всегда можете использовать {% ifequal a b %}...{% endifequal %}
в старых версиях Django.
Я предполагаю, что вы читаете документацию по разработке (django 1.2), но используете django 1.1 или 1.1.1
Однако, если вам нужно сделать {{ foo|length }}
и сравнить вывод этого шаблонного тега + фильтра, вы не сможете. Вам нужно будет исправить логику представления, чтобы она вычисляла это для вас, чтобы вы могли использовать это в шаблоне.
Также, в зависимости от того, как вы используете список, вы можете посмотреть for...empty
:
http://docs.djangoproject.com/en/dev/ref/templates/builtins/#for-empty
Вы используете переменную шаблона с именем foo_list
:
{% if foo_list == 1 %}
но в шаблоне, который строит ваш код, такой переменной нет, только foo
и foo_count
.