Я могу сравнить переменную шаблона с целым числом в шаблонах Механизма Django/App?

Используя шаблоны 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 (шаблоны или любая часть его), я был бы точно так же, как некоторое подтверждение сначала.

5
задан matt b 5 May 2010 в 01:56
поделиться

3 ответа

Вы, скорее всего, используете 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 %}
4
ответ дан 14 December 2019 в 01:03
поделиться

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

1
ответ дан 14 December 2019 в 01:03
поделиться

Вы используете переменную шаблона с именем foo_list:

{% if foo_list == 1 %}

но в шаблоне, который строит ваш код, такой переменной нет, только foo и foo_count.

1
ответ дан 14 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: