Django中的“resolve_variable”做什么?(“template.Variable”)
resolve_variable
是干什么的?我能不能在视图外部用它来访问 request
呢?
编辑
所以 template.Variable
是正确的选择,但我还是不太明白它的用途。文档里也没有太多帮助。
谢谢大家。
3 个回答
0
resolve_variable
是干什么的?
我可以用它在视图外部访问请求吗?
在模板标签中可以使用吗?可以,只要请求在上下文中就行。不过,如果你使用的是简单标签或包含标签,其实不一定需要 resolve_variable
。
1
template.Variable("key.dot.notation").resolve(dict)
这个方法可以通过点号表示法从字典中获取值。
举个例子,你可以从 my_dict
中获取 name
和 age
,在 test
视图中可以这样做:
# "views.py"
from django.http import HttpResponse
from django import template
def test(request):
my_dict = {'person':{'name':'John','age': 36}}
name = template.Variable("person.name").resolve(my_dict) # Here
age = template.Variable("person.age").resolve(my_dict) # Here
print(name, age) # John 36
return HttpResponse("Test")
而且,你也可以用下面的方式得到相同的结果:
# "views.py"
from django.http import HttpResponse
from django import template
def test(request):
my_dict = {'person':{'name':'John','age': 36}}
person = template.Variable("person").resolve(my_dict)
print(person['name'], person['age']) # John 36
return HttpResponse("Test")
但是,如果你尝试获取一个在 my_dict
中不存在的键,比如 gender
,就会出现下面的情况:
# "views.py"
from django.http import HttpResponse
from django import template
def test(request):
my_dict = {'person':{'name':'John','age': 36}}
gender = template.Variable("person.gender").resolve(my_dict) # Here
print(gender)
return HttpResponse("Test")
这时,你会看到下面的错误信息:
django.template.base.VariableDoesNotExist: 在 {'name': 'John', 'age': 36} 中查找键 [gender] 失败
*你可以查看 @register.tag 的例子,了解如何在 将模板变量传递给标签 中使用 template.Variable("key.dot.notation").resolve(dict)
从 context
中获取值。
5
我猜你是在尝试写一个自定义的模板标签,下面是你该怎么做。
在你的编译函数中,你可以这样绑定变量:
@register.tag
def my_tag(parser, token):
# This version uses a regular expression to parse tag contents.
try:
# Splitting by None == splitting by spaces.
tag_name, var_name = token.contents.split(None, 1)
except ValueError:
raise template.TemplateSyntaxError, "%r tag requires arguments" % token.contents.split()[0]
#this will "bind" the variable in the template to the actual_var object
actual_var = template.Variable(var_name)
return MyNode(template_variable)
class MyNode(template.Node):
def __init__(self, actual_var):
self.actual_var = actual_var
def render(self, context):
actual_var_value = self.actual_var.resolve(context)
#do something with it
return result
如果你只想访问请求信息,可以直接在节点中绑定这个变量。确保你在上下文中有请求信息:
from django.template import RequestContext
def my_view(request):
#request stuff
return render_to_response("mytemplate.html", {'extra context': None,}, context_instance=RequestContext(request))
然后在你的模板标签代码中。
@register.tag
def simple_request_aware_tag(parser, token):
return SimpleRequestAwareNode()
class SimpleRequestAwareNode(template.Node):
def render(self, context):
request = template.Variable('request').resolve(context)
#we want to return the current username for example
return request.user.get_full_name()