将类命名为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
请填写????????如果可以的话。
答案 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以获得更多通用功能和功能,这些功能和功能取决于当前请求,而不是仅适用于特定上下文中某个特定模型的内容。而且,最重要的是,它们不适用于不限于模板的功能。