Фильтры GAE / Django Templates (0.96) для получения ДЛИНЫ GqlQuery и фильтрации - PullRequest
0 голосов
/ 28 марта 2010

Я передаю запрос с комментариями в свой шаблон:

    COMM = CommentModel.gql("ORDER BY created")

    doRender(self,CP.template,{'CP':CP,'COMM':COMM, 'authorize':authorize()})

И я хочу вывести количество комментариев в результате, и я пытаюсь сделать что-то вроде этого:

    <a href="...">{{ COMM|length }} comments</a>

Это не работает (да, поскольку COMM это GqlQuery, а не список).Что я могу сделать с этим?Есть ли способ конвертировать GqlQuery в список или есть другое решение?(первый вопрос) [1]

Второй вопрос [2]: как отфильтровать этот список в шаблоне?Есть ли такая конструкция:

    <a href="...">{{ COMM|where(reference=smth)|length }} comments</a>

, чтобы я мог получить не только количество всех комментариев, но и только комментарии с определенным свойством db.ReferenceProperty (), например.

Последний вопрос [3]: странно ли делать такие вещи с помощью шаблонов?

UPD: Вопросы [1] и [3] мне очень понятны, благодаря Нику Джонсону иАлекс Мартелли.

Вопрос [2] сложен и, возможно, противоречит идее MVC, но я действительно надеюсь решить его только с помощью шаблонов: (есть некоторые причины).Это может быть так же уродливо, как и бывает.

Ответы [ 3 ]

3 голосов
/ 28 марта 2010

Вызовите .fetch () для запроса, возвращая список результатов, прежде чем передать его в шаблон. Любое другое решение, такое как вызов .count (), приведет к многократному выполнению запроса, что приведет к потере времени процессора и настенных часов.

Аналогично, если вам нужно отфильтровать запрос, вы должны сделать это в своем собственном коде, прежде чем передавать результаты в систему шаблонов.

1 голос
/ 28 марта 2010

Вы можете использовать count для вашего GqlQuery объекта, но GqlQuery не позволяет вам добавлять where предложения и тому подобное - вам нужно Query для это (и его фильтр метод).

Да, очень необычно "загрязнять" логику представления (т.е. шаблоны) такими аспектами бизнес-логики, как фильтрация. Обычно серверный код Python будет выполнять такие вызовы и вставлять результаты в контекст, оставляя логику представления (шаблон) строго для решения только проблем представления - серверная часть решает, что показывать, логика представления решает только как показать это.

Если вы предпочитаете менее обычный стиль с большим количеством логики в шаблонах (архитектура, которую многие считают странной), рассмотрите альтернативные системы шаблонов, такие как Mako , потому что система шаблонов Django действительно разработана против такой "странной архитектуры"; -).

0 голосов
/ 31 июля 2010

Я не совсем уверен, что вы пытаетесь достичь, но вы могли бы извлечь выгоду из URL Mapping, однако это потребует некоторого дополнительного кода. Основная идея заключается в том, что вы должны превратить любое значение, которое хотите отфильтровать, в «каталог». Примеры помогут:

<a href="basepath/{{ value.tofilterfrom }}">link text</a>

Тогда в вашем коде на Python вам нужно изменить объект WSGIApplication с помощью уникального обработчика. Что-то вроде:

application = WSGIApplication(
                              [('/', MainPage),
                               (r'/basepath/(.*)', Products),

Просто создайте новый класс с именем Products, и он автоматически выберет значение фильтра и сохранит его в переменной для вас, например:

class Products(webapp.RequestHandler):
    def get(self, ProductID):

И это все, вы можете расширить это столько, сколько хотите, добавить больше уровней. В классе Products вы просто отфильтруете свой объект Query, используя в качестве критерия переменную ProductID.

У меня есть более подробная информация в моем блоге , если вы хотите узнать больше об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...