Django中的“resolve_variable”做什么?(“template.Variable”)

2 投票
3 回答
2934 浏览
提问于 2025-04-16 07:05

resolve_variable 是干什么的?我能不能在视图外部用它来访问 request 呢?


编辑

所以 template.Variable 是正确的选择,但我还是不太明白它的用途。文档里也没有太多帮助。

谢谢大家。

3 个回答

0

resolve_variable 是干什么的?

它的作用是解析模板标签中的变量。

我可以用它在视图外部访问请求吗?

在模板标签中可以使用吗?可以,只要请求在上下文中就行。不过,如果你使用的是简单标签或包含标签,其实不一定需要 resolve_variable

1

template.Variable("key.dot.notation").resolve(dict) 这个方法可以通过点号表示法从字典中获取值。

举个例子,你可以从 my_dict 中获取 nameage,在 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()

撰写回答