Вызов функции Python в шаблоне Django - PullRequest
7 голосов
/ 22 января 2010

Внутри шаблона django я пытаюсь вызвать функцию split для одной из переменных шаблона и затем получить последний элемент, поэтому я сделал что-то вроде этого:

{{ newsletter.NewsletterPath.split('/').-1 }}

К сожалению, раскол не нравится. Кто-то может предложить мне разделить представление, но я не уверен, как это сделать, потому что мне нужно сделать это для всех записей. Было бы намного проще, если бы я мог сделать это в шаблоне. Есть ли способ сделать это?

Ответы [ 4 ]

7 голосов
/ 22 января 2010

Из книги Джанго :

Обратите внимание, что вы не включаете скобки в вызовы метода. Кроме того, невозможно передать аргументы в методы; Вы можете вызывать только те методы, которые не имеют обязательных аргументов.

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

6 голосов
/ 22 января 2010

Что вы подразумеваете под "не нравится раскол"? Как это проявляет свою неприязнь?

Если я правильно помню, вы не можете передавать любые произвольные аргументы в методы, которые вызываются из шаблона django, а идентификаторы, которые могут использоваться в шаблонах, могут состоять только из аз, AZ, 0-9, подчеркиваний и точки (где точки означают поиск: словарь-> атрибут-> метод-> список-индекс).

Существует как минимум четыре способа достичь желаемого:

  • сделать правильно подготовленные данные доступными в качестве атрибута вашей модели (или чего бы то ни было), предварительно обработав их
  • сделайте данные доступными как метод вашей модели и убедитесь, что метод не принимает никаких обязательных аргументов, кроме self
  • заполнение экземпляров модели в представлении

     for newsletter in newsletters:
          setattr(newsletter, 'basepath',
                  newsletter.NewsletterPath.split('/')[-1])
    

    (или что-то в этом роде)

  • реализовать собственный тег фильтра, который будет обрабатывать разбиение (проще, чем вы думаете)
5 голосов
/ 22 января 2010

Шаблоны сознательно не способны делать такие вещи. Цель состоит в том, чтобы не допустить размещения вашей бизнес-логики в шаблонах, которые предназначены только для макета.

Таким образом, возможный способ сделать это - определить функцию NewsletterPathLastElement (self) в вашей модели информационного бюллетеня и вызвать ее из шаблона.

0 голосов
/ 22 января 2010

Да, как уже говорили другие, вы не должны делать это в шаблонах.

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

...