Вызов функции 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) в вашей модели информационного бюллетеня и вызвать ее из шаблона.
да, как говорили другие, вы не должны делать это в шаблонах.
но если вы хотите, то нужно определить фильтр и загрузить его в шаблон и использовать его.