2010-09-29 70 views
0

使用装饰时,呈现模板我有这个网址在我的项目:问题在Django

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) 

我得到一个TemplateDoesNotExist在/ alerts/inbox/。如果我这样做:

fn(request, kwargs['template_name']) 

它呈现模板没有问题。我不知道为什么会发生这种情况。但是如果我必须传递一个特定的参数给视图,它完全打破了装饰者的DRY原则。

回答

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将成为其值。

+0

感谢您的回答,我错过了星号,甚至没有注意到。 – maraujop 2010-09-29 09:31:24