【问题标题】:Django custom tags interactionsDjango 自定义标签交互
【发布时间】:2011-12-19 00:55:39
【问题描述】:

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

而且效果很好。接下来我定义了标签{% get_user_items user %},它获取用户对象并通过变量user_photo返回用户的照片url:{{ user_photo }}

我想在这 2 个自定义标签之间进行交互。它的意思是这样的:

{% 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 %}

提前感谢您的回答!!!

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    您必须使用上下文将字符串解析为变量。参见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 可以访问上下文,这就是它在这里完成的原因)。这是通过在 __init__ 方法中创建的实例变量上调用 resolve 并将上下文作为参数传递给它来完成的。该变量可能无法解析,这就是它需要位于 try...except 块中的原因。

    【讨论】:

    • 怎么做(几句话)?
    • 换句话说,TL;DR。我已经更新了我的答案,指出了相关的部分并大致解释了发生了什么,但在某个时候,你只需要深入研究文档或放弃并回家。
    • 是的,这正是我想要的!非常感谢这么简单的例子。
    猜你喜欢
    • 2010-10-01
    • 2012-07-07
    • 2010-10-10
    • 2011-07-11
    • 1970-01-01
    • 2011-03-03
    • 2011-09-16
    • 2021-07-13
    • 2020-01-24
    相关资源
    最近更新 更多