Вызов функции Python в шаблоне Django

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

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

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

4 ответов


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

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

есть по крайней мере четыре способа достичь того, что вы хочу:

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

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

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

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

с книга Джанго:

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

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


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

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


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

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