2010-01-22 2 views
7

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

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

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

+0

возможный дубликат функции вызова шаблона Django] (http://stackoverflow.com/questions/2468804/django-template-call-function) – Marcin

ответ

6

Что значит «не нравится раскол»? Как проявляется его неприязнь?

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

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

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

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

    (или что-то вдоль этих линий)

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

От django book:

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

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

4

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

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

0

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

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

Смежные вопросы