Django自定义标签交互

时间:2011-10-31 20:09:36

标签: django django-templates

我定义了一个自定义标记{% get_user user_id %},用于捕获用户的id并通过变量user_obj返回用户对象:{{ user_obj.email }}, {{ user_obj.name }}, {{ user_obj.photo.url }}等等。

它工作正常。接下来,我定义了标记{% get_user_items user %},它获取用户对象并通过变量user_photo返回用户的照片网址:{{ user_photo }}

我想在这2个自定义标记之间进行交互。这意味着smth:

{% load user_tags %}
{% get_user 1 %}
{{ user_obj }} // returns unicode string as expected
{% get_user_items user_obj %}
{{ user_photo }}

据我所知,标签'get_user_items'必须通过变量user_obj获取用户对象,但不是 - 它从变量user_obj获取通常的字符串'user_obj',而不是对象!!!

如何解决这个问题?我究竟做错了什么???如何直接从变量{{ user_obj }}向标记{% get_user_items %}传输值?

提前感谢您的回答!!!

1 个答案:

答案 0 :(得分:2)

您必须使用上下文将字符串解析为变量。请参阅有关passing template variables to tags in the Django docs

的讨论
class FormatTimeNode(template.Node):
    def __init__(self, date_to_be_formatted, format_string):
        self.date_to_be_formatted = template.Variable(date_to_be_formatted)
        self.format_string = format_string

    def render(self, context):
        try:
            actual_date = self.date_to_be_formatted.resolve(context)
            return actual_date.strftime(self.format_string)
        except template.VariableDoesNotExist:
            return ''

这是文档中的示例。您必须先使用template.Variable将值标记为变量。对此的论据是包含变量名称的参数。在示例中,那是date_to_be_formatted。这将保存为节点上的实例变量,以便稍后在render方法中可用。

然后,在render方法中,您尝试从上下文中解析变量(render可以访问上下文,这就是为什么在这里完成的原因)。这是通过在resolve方法中创建的实例变量上调用__init__并将其作为参数传递给上下文来完成的。该变量可能无法解决,这就是它需要位于try...except块中的原因。