我有很多基於類的視圖使用reverse(name,args)來查找url並將其傳遞給模板。但是,問題是基於類的視圖必須在可以定義urlpatterns之前實例化。這意味着類實例化,而urlpatterns是空的,導致反向拋出錯誤。我一直在通過將lambda:reverse(name,args)傳遞給我的模板來解決這個問題,但肯定會有更好的解決方案。Django類瀏覽次數和反向Url
作爲簡單的示例下面將失敗,異常: ImproperlyConfigured在所包含的URL配置mysite.urls XXXX 沒有任何圖案在它
mysite.urls
from mysite.views import MyClassView
urlpatterns = patterns('',
url(r'^$' MyClassView.as_view(), name='home')
)
views.py
class MyClassView(View):
def get(self, request):
home_url = reverse('home')
return render_to_response('home.html', {'home_url':home_url}, context_instance=RequestContext(request))
home.html的
<p><a href={{ home_url }}>Home</a></p>
我目前解決該問題通過強制反向模板渲染運行通過改變views.py到
class MyClassView(View):
def get(self, request):
home_url = lambda: reverse('home')
return render_to_response('home.html', {'home_url':home_url}, context_instance=RequestContext(request))
和它的作品,但是這實在是太醜了,肯定有更好的辦法。那麼,有沒有辦法使用基於類的觀點相反,但要避免需要視需要反向要求urlpatterns的URL模式的循環依賴...
編輯:
我使用這像這樣:
views.py
def sidebar_activeusers(cls):
sidebar_dict = {'items' = []}
qs = models.random.filter.on.users
for user in qs:
item = {
'value': user.name,
'href': reverse('user_profile', args=[hash_id(user.id)])}
sidebar = loader.get_template('sidebar.html')
cls.base_dict['sidebar_html'] = sidebar.render(Context(sidebar_dict))
return cls
@sidebar_activeusers
class MyView1(View):
base_dict = {}
...
@other_sidebar_that_uses_same_sidebar_template
class MyView2(View):
基本上我想使用相同的側邊欄模板的幾個不同的內容類型。雖然側欄中顯示的模型將是任意的,但格式將始終相同。
正是我在找什麼,謝謝! – kalhartt