Django Templates - передача значения переменной в шаблоне в фильтр templatetags - PullRequest
1 голос
/ 23 мая 2009

имя класса, идентификатор, первый и последний атрибуты

В моем view.py я извлекаю объект name из базы данных и передаю его в шаблон index.html.

В моем templagetags/my_tags.py у меня есть фильтр my_private_tag(value, arg), который принимает значение и аргумент. Добавляет arg к значению и возвращает результат.

def my_private_tag(value, arg):
  return value + ' ' + arg

В моем теге index.html мне нужно сделать следующее.

{% if name %}

  # to display 
  # John says hello
  {{name.first | my_private_tag:"says hello"}

  # Johns student id = id_value
  {{name.first | my_private_tag:"????????"}

  # Johns student id = id_value, lastname = lastname_value
  {{name.first | my_private_tag:"????????"}

{% endif %}

Где:

id_value = name.id & lastname_value = name.last

Пожалуйста, заполните поле ???????? если сможешь.

Ответы [ 3 ]

8 голосов
/ 23 мая 2009

Вместо реализации собственного фильтра для этого. Почему бы не сделать это так:

{{name.first }} says hello
{{name.first }}'s student id = {{ name.id }}

Это гораздо более читабельно. И так или иначе вы должны использовать шаблоны.

Если вы все еще хотите использовать пользовательский фильтр для этого, вы, вероятно, можете передать переменную следующим образом:

{{name.first|my_private_tag:name.id}}
0 голосов
/ 03 апреля 2016

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

Вместо этого это должно быть свойство модели:

class Student(models.Model):
    firstname = models.CharField(...)
    lastname = models.CharField(...)

    @property
    def student_id(self):
        return '{}{}'.format(self.id, self.lastname)

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

В шаблоне:

{% if student %}

  # to display 
  # John says hello
  {{ student.firstname }} says hello

  # John's student id
  Student ID: {{ student.student_id }}

{% endif %}

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

0 голосов
/ 23 мая 2009

Если фильтр получает только две строки, он не будет иметь доступа к исходному объекту имени, поэтому нет способа получить идентификатор.

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

Johns student id = 47, lastname = Doe

из фильтра. Как бы вы это сделали? Сначала вам нужно будет передать объект name в фильтр

{{name|my_private_tag:"??????"}}

Код для фильтра становится

return name.first_name + "s student id = " + name.id + ", lastname = " + name.last_name

Обратите внимание, что вы не используете аргумент. Если вы хотите, чтобы ваш фильтр возвращал разные вещи в зависимости от аргумента, то добавьте условную логику и поехали.

...