如何在Django视图装饰器中设置上下文中的值?

时间:2011-02-03 20:10:26

标签: python django django-templates django-views

我想写一个装饰器,它将为模板渲染上下文提供值,如下所示:

@deco(art=Nouveau)
def my_wall(request):
    # should have art == 'something' in the template
    return render_from_template('plain_white.html', {art:'something'}, context_instance=RequestContext(request))

@deco(art=Nouveau)
def my_wall(request):
    # should have art == Nouveau in the template
    return render_from_template('plain_white.html', {}, context_instance=RequestContext(request))

我最初尝试实现它看起来像这样:

class deco(object):

    def __init__(self, art=None):
        self.art = art

    def __call__(self, f):
        @wraps(f)
        def wrapper(request, *args, **kwargs):
            if self.art:
                request.setdefault('art', self.art)

            return f(request, *args, **kwargs)

然而,这不起作用,因为请求不是真正的字典。

我该如何实现?

1 个答案:

答案 0 :(得分:3)

执行此操作的唯一方法是装饰器本身负责渲染和返回模板。还有一个完善的代码片段:render_to装饰器。这个想法是你的视图只返回一个字典,装饰者实际上渲染它。您应该能够编辑该代码段,以便它处理默认情况。