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

Posted

技术标签:

【中文标题】Django Templates — 将模板中的变量值传递给 templatetags 过滤器【英文标题】:Django Templates — passing value of a variable in a template to templatetags filter 【发布时间】:2010-10-28 09:13:12 【问题描述】:

命名类一个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

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

【问题讨论】:

我编辑了我的示例,它现在应该可以工作了。 name.first|my_private_tag:name.id 【参考方案1】:

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

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

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

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

name.first|my_private_tag:name.id

【讨论】:

谢谢 Nadia,我举了一个简单的例子来说明如何做到这一点。真正的过滤器将对输入做更多的事情。供您参考,这根本行不通。 name.first | my_private_tag:name.id。谢谢。 我删除了过滤器和参数之间的空格。显然 django 不喜欢那样。新示例对我有用。 谢谢 Nadia,你知道如何进行这项工作吗:name.first|my_private_tag:studend_id=name.id。类似于命名参数。【参考方案2】:

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

当您可以使用现有标签获得所需结果时,我认为您想使用过滤器执行此操作,因此您走错了方向。但是,为了争论,假设你可以得到

Johns student id = 47, lastname = Doe

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

name|my_private_tag:"??????"

过滤器的代码就变成了

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

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

【讨论】:

【参考方案3】:

如果您需要一个仅由业务逻辑规定的模型字段值组合组成的值,则模板标签不是正确的选择。

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

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 %

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

【讨论】:

以上是关于Django Templates — 将模板中的变量值传递给 templatetags 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

55.django模板层(templates)

Django中的模板和表单

Django模板路径设置:templates,TEMPLATE_DIRS,TEMPLATES

Django入门学习--深入模板(templates)

Django入门学习--深入模板(templates)

Django框架之templates(模板)系统