我的项目中有这个网址:
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原则。
答案 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
将成为其值。