2010-09-29 67 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