2012-11-29 50 views
1

我有很多基於類的視圖使用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): 

基本上我想使用相同的側邊欄模板的幾個不同的內容類型。雖然側欄中顯示的模型將是任意的,但格式將始終相同。

回答

2

對於示例MyClassView,這是確定使用reverse

class MyClassView(View): 
    def get(self, request): 
     home_url = reverse_lazy('home') 
     return render_to_response('home.html', {'home_url': home_url}, 

類定義時不叫reverse方法 - 在處理請求它只是調用,get方法被調用,所以不應該有錯誤。我已經測試了上面的例子,它工作正常。

但是,當您使用sidebar_activeusers修飾符時,reverse調用在加載url conf之前發生。在這些情況下,您可以使用reverse_lazy。下面是reverse_lazy在行動的例子:

from django.core.urlresolvers import reverse_lazy 

class MyOtherClassView(View): 
    home_url = reverse_lazy('home') 

    def get(self, request): 
     return render_to_response('home.html', {'home_url':self.home_url}, context_instance=RequestContext(request)) 

這一次,home_url是類定義時設定,所以reverse_lazy是必需的,而不是相反,因爲URL的conf尚未加載。

+0

正是我在找什麼,謝謝! – kalhartt

2

您的home可以通過聲明{% url 'home' %}直接在您的模板中訪問網址。這是訪問您的urls.py文件中的指定網址的標準方式。

您不必在基於類的視圖函數中明確地將home_url變量發送到您的模板。

換句話說,在你home.html文件: -

<p><a href="{% url 'home' %}">Home</a></p> 

會做。

+0

以上只是一個簡單的例子來演示使用。我會用更好的示例更新我的帖子,以說明爲什麼我不能使用它。 – kalhartt