1

name class 一个 id,一个 first & a last 属性

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

在我的中,我有一个带有值和 argtemplagetags/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

请填写??????如果你可以的话。

4

3 回答 3

8

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

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

它更具可读性。无论如何,这就是您应该使用模板的方式。

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

{{name.first|my_private_tag:name.id}}
于 2009-05-23T00:47:06.390 回答
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

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

于 2009-05-23T05:06:20.033 回答
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 %}

应该为更通用的功能和取决于当前请求的功能创建模板标签,而不是为您将只应用于特定上下文中的一个特定模型的东西创建模板标签。而且,最重要的是,它们不适用于不限于模板的功能。

于 2016-04-03T11:13:01.493 回答