在Django中使用装饰程序时呈现模板时出现问题
我的项目中有此URL:在Django中使用装饰程序时呈现模板时出现问题,django,decorator,Django,Decorator,我的项目中有此URL: 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(r
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))
我自己的SBID装饰师是:
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'])
它可以毫无问题地呈现模板。我不知道为什么会这样。但是如果我必须向视图传递一个特定的参数,它完全打破了装饰器的枯燥原理。你能试试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\u name
的值就是dictionary对象
在第二种情况下(
foo(**d)
),您正在扩展字典并将键和值作为关键字参数传递。template\u name
键将成为关键字参数,foo/bar.html
将成为其值。谢谢你的回答,我错过了星号,甚至没有注意到。