Django模板 - 将模板中变量的值传递给templatetags过滤器

时间:2009-05-23 00:39:26

标签: django templates django-templates tags

将类命名为id,第一个&最后一个属性

在我的view.py中,我从数据库中获取一个名称对象并将其传递给index.html模板。

在我的templagetags/my_tags.py中,我有一个过滤器my_private_tag(value, arg),它取值和一个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 个答案:

答案 0 :(得分:8)

而不是为此实现自己的过滤器。为什么不这样做:

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

它更具可读性。这就是你应该如何使用模板。

如果你仍然想为此使用自定义过滤器,你可以传递这样的变量:

{{name.first|my_private_tag:name.id}}

答案 1 :(得分:0)

如果过滤器只获得两个字符串,则无法访问原始名称对象,因此无法获取该ID。

我认为当你可以使用现有的标签来获得你想要的结果时,想要使用过滤器来做这个方向是错误的。但是,为了争论,让我们说你可以得到

Johns student id = 47, lastname = Doe

来自过滤器。你会怎么做?首先,您必须将名称对象传递给过滤器

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

然后过滤器的代码变为

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

请注意,您没有使用该参数。如果你希望你的过滤器根据参数返回不同的东西,那么添加条件逻辑然后离开。

答案 2 :(得分:0)

如果您需要的值仅包含业务逻辑规定的模型字段值的组合,则模板标签不是正确的方法。

相反,这应该是模型的属性:

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

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

您可以在任何地方使用此属性,不仅可以在模板中使用,还可以在视图,导出,管理UI等中使用。您可能需要看到student_id听起来像是一个非常重要的属性。

在模板中:

{% if student %}

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

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

{% endif %}

应创建Templatetags以获得更多通用功能和功能,这些功能和功能取决于当前请求,而不是仅适用于特定上下文中某个特定模型的内容。而且,最重要的是,它们不适用于不限于模板的功能。