2009-05-23 94 views
1

名称类的ID,第一&最后一个属性Django的模板 - 在模板中templatetags传递变量的值过滤

在我view.py,我从数据库中获取一个名字对象并把它传递到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 

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

+0

我编辑我的例子,它现在应该工作。 {{name.first | my_private_tag:name.id}} – 2009-05-23 02:22:36

回答

8

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

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

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

如果你仍然想使用这个自定义过滤器,你也许可以通过这样的变量:

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

感谢Nadia, 嗯,我举了一个简单的例子来弄清楚如何做到这一点。 真正滤波器将输入更多的东西。 并为您的信息,这是行不通的。 {{name.first | my_private_tag:name.id}}。谢谢。 – un33k 2009-05-23 02:01:14

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 

通知。如果你想让你的过滤器根据参数返回不同的东西,那么添加条件逻辑并关闭你。

0

如果你需要只包括由业务逻辑决定的模式字段值的组合值,templatetag是不正确的方式去。

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

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应该更通用的功能和功能取决于当前的请求成立,并没有什么东西你永远都只能适用于一个特定的模式在特定的背景。而且,最重要的是,他们的目的不是为不局限于模板功能。