Так как Django не рекомендует передавать аргументы функциям в шаблонах, что поощряется вместо этого? - PullRequest
5 голосов
/ 23 марта 2011

Я понимаю, что в Django язык шаблонов специально кастрирован для предотвращения слишком большого количества вычислений в коде дисплея.Это означает, что в идеале для каждой ситуации, когда пользователи могут чувствовать необходимость выполнять вычисления, есть более подходящая альтернатива.Либо тег, либо фильтр, который делает свое дело, либо что-то, надеюсь, прямо в представлении.Надеюсь, что любые неприятности, которые здесь не вписываются, редки.

Но я нашел общий случай, который довольно раздражает, и у Django есть лучший способ сделать это, о котором я даже не думал,или они должны увидеть свет здесь и немного сдвинуть строку с вычислениями в шаблоне в ближайшем будущем выпуске (как, например, с параметрами оператора if):

У меня есть набор запросов элементов,Мне нужно как-то их отображать, но то, что я показываю, зависит не только от состояния объекта, но и от других независимых вещей (обычно от того, кто вошел в систему).Поэтому добавление функции в модель не поможет.

То, что я делал до сих пор, - это превращение набора запросов в список или древовидную структуру (в зависимости от задачи) и добавление атрибута view_extra.каждому.view_extra - это словарь, в котором я обычно придерживаюсь значений, которые зависят от таких вещей, как то, кто вошел в систему. Помимо проблем, он также уничтожает лень набора запросов.Я думаю, я мог бы пойти так далеко, чтобы сделать генератор, но, очевидно, это не то, что разработчики Django намеревались сделать для нас.

Я, вероятно, должен попробовать больше аннотации наборов запросов, но я не знаюнасколько хорошо это будет работать в некоторых более сложных случаях.Кроме того, ничего хорошего в сценарии структуры дерева или списка в списке (набор запросов элементов с элементами, которые являются дополнительными наборами запросов, мне нужно выполнить итерацию).

Я мог бы зарегистрировать фильтр (как предложено здесь система шаблонов django, вызывающая функцию внутри модели ), но это злоупотребление фильтрами, верно?Они предназначены для преобразования текста и, возможно, данных, а не для того, чтобы заменить собой то, что разработчики сознательно пытались заставить нас не делать.

Любой «правильный» способ сделать это, что я не делаюзнать о?Неужели я не согласен с предположением, что это недостаток системы шаблонов Джанго в ее нынешнем виде?

Ответы [ 2 ]

4 голосов
/ 23 марта 2011

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

2 голосов
/ 23 марта 2011

Может быть Шаблоны Jinja будет хорошей альтернативой использованию системы шаблонов Django в этом случае. Помимо важного факта, что Jinja позволяет вам использовать некоторый уровень логики в ваших шаблонах, шаблоны Jinja и шаблоны Django практически идентичны.

Этот пример кода, взятый непосредственно из документов Jinja, выглядит так, как будто вы пытаетесь достичь этого.

{% for comment in models.comments.latest(10) %}
    ...
{% endfor %}

Чтобы интегрировать Джинджу с Джанго, вы можете посмотреть на Гроб

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