我定义了一个自定义标记{% 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 %}
传输值?
提前感谢您的回答!!!
答案 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
块中的原因。