2015-06-04 27 views
2

只是通過一些CBV的工作,並想知道這是不好的風格。通常情況下,您的views.py中有一個班級,該視圖中有一個urls.py的網址。喜歡的東西:Django基於類的視圖 - 將所有代碼放在urls.py中是否是一種糟糕的風格?

views.py

from django.views.generic.list import ListView 
from project.models import Contact 

class ContactList(ListView): 
    model = Contact 

urls.py

from django.views.generic.list import ListView 
from project.views import ContactList 

urlpatterns = [ 
    url(r'contacts/$', ContactList.as_view()), 
] 

,然後模板來顯示數據。

但是,這個剛剛跳過視圖代碼完全,做這一切是這樣的urls.py文件中:

from django.views.generic.list import ListView 
from project.models import Contact 

urlpatterns = [ 
    url(r'contacts/$', ListView.as_view(model=Contact)), 
] 

那是不好的風格組所有入urls.py文件?我的意思是,它擺脫views.py內的多餘代碼,所以這不是很好?或者這是以犧牲清晰度爲代價的減少?

回答

5

這是更更好地保持視圖邏輯出的URLconf的。 一覽url(r'contacts/$', ListView.as_view(model=Contact))似乎不錯,但實際上它違反了Django的設計理念:

  • 網址,訪問量,車型之間的鬆散耦合已換上緊一個,所以現在你就無法再使用視圖。
  • URL的靈活性被破壞。繼承,CBV的主要優勢是不可能在URL中使用它們。
  • 許多其他事情,例如,如果你想添加身份驗證?授權?你需要將所有這些包裝在裝飾器中,你的URL很快就會變得混亂。

所以:

  • 瀏覽模塊應該包含視圖邏輯。
  • URL模塊應包含URL的邏輯。
+0

我當然不服氣,你可以用'URL(r'contacts/$」,ListView控件生活。as_view(model = Contact))'直到你需要重用這個視圖 - 但顯然你在這個階段沒有理由這樣做。 – jpic

+0

將視圖的定義從urls.py移動到views.py不會實現鬆耦合!它只是移動代碼!哦,上帝 – jpic

+0

如果你想添加驗證,該怎麼辦?您仍然可以在urls.py中修飾視圖。如果你需要更復雜的東西呢?那麼只需在views.py中聲明視圖,做**實用**,關心你現在需要的**,而不是明天**可能需要的**。 – jpic

2

答案是:這取決於。

如果你正在寫一個非常小的應用程序,你知道,不會得到更大的話,那也沒有關係,除非你無法抗拒代碼味道,你其實可以寫你的整個應用程序在短短的一個文件中,檢查答案,這太問題,例如How do I write a single-file Django application?

PS:這個問題是普遍的,是沒有辦法Django的具體。

+0

你是什麼意思呢「殺死MVT」?當代碼增長時,將它移開,你談論MVC以支持可憐的爭論,這是怎麼讓代碼更難閱讀,因爲無論如何你會閱讀urls.py來找出哪個視圖用於特定的url(除非你當然使用django-debug-toolbar,那麼你現在就是)。把你放在觀察名單上?哦,上帝...... – jpic

+1

必須從views.py跳轉到urls.py才能說出視圖所做的是代碼味道,而且你所說的是正確的,我只是通過提及MVC開車離開主題,我可能考慮到其他想法,我表達不好。謝謝 – HassenPy

0

嗯,「減少views.py過剩代碼」肯定不是一個原因。如果您打算使用幾個簡單的參數實例化通用視圖,只要它適合您,可以將其保存在urls.py中。當它不再工作時,可能將其移至views.py或將視圖設爲模塊並將其移至views/someview.py,這並不重要。

相關問題