在Django中使用装饰器时渲染模板的问题

时间:2010-09-29 09:14:08

标签: django decorator

我的项目中有这个网址:

url(r'^alerts/inbox/$', 'inbox', {'template_name': 'inbox.xhtml' }, name = 'inbox'),

收件箱视图就是这样:

@login_required()
@ownsBid
def inbox(request, template_name):
    return render_to_response(template_name, context_instance=RequestContext(request))

我的ownsBid装饰器是:

def ownsBid(fn):
    def _check(request, *args, **kwargs):
        return fn(request, kwargs)

    return _check

当我使用时:

fn(request, kwargs) 

我在/ alerts / inbox / 获得 TemplateDoesNotExist。如果我改为:

fn(request, kwargs['template_name'])

它可以毫无问题地呈现模板。我不知道为什么会这样。但是如果我必须将一个特定的参数传递给视图,它就完全打破了装饰者的DRY原则。

1 个答案:

答案 0 :(得分:2)

您可以试试fn(request, **kwargs)吗?这是一个快速说明:

>>> def foo(template_name):
 print template_name

>>> d = dict(template_name =  'foo/bar.html')
>>> foo(d)
{'template_name': 'foo/bar.html'}
>>> foo(**d)
foo/bar.html
>>> 

那么这里发生了什么?在第一种情况下(foo(d)),您将字典按原样传递给函数。当然,template_name的值就是字典对象。

在第二种情况下(foo(**d)),您展开 unpacking字典,并将键和值作为关键字参数传递。 template_name键将成为关键字参数,foo/bar.html将成为其值。