基于Django类的视图 - 将所有代码放在urls.py中是不好的风格?

Gar*_*nzo 2 python django django-class-based-views

刚刚完成一些CBV的工作,并想知道这是不好的风格.通常,您views.pyurls.py该视图中有一个类,在该视图中有一个URL .就像是:

views.py

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

class ContactList(ListView):
  model = Contact
Run Code Online (Sandbox Code Playgroud)

urls.py

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

urlpatterns = [
    url(r'contacts/$', ContactList.as_view()),
]
Run Code Online (Sandbox Code Playgroud)

然后是一个显示数据的模板.

但是,如何完全跳过视图代码并在urls.py文件中完成所有操作:

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

urlpatterns = [
    url(r'contacts/$', ListView.as_view(model=Contact)),
]
Run Code Online (Sandbox Code Playgroud)

将它全部分组到urls.py文件中的样式是不是很糟糕?我的意思是,它摆脱了多余的代码,views.py所以不是那么好吗?或者这是以牺牲清晰度为代价的减少?

pyt*_*had 5

将视图逻辑保留在URLConfs之外要好得多.一眼url(r'contacts/$', ListView.as_view(model=Contact))看上去似乎还可以,但实际上它违反了Django的设计理念:

  • 网址,视图,模型之间的松散耦合已被紧密替换,因此现在您无法重用您的视图.
  • URL的灵活性被破坏.继承,CBV的主要优势是不可能在URL中使用它们.
  • 许多其他事情,例如,如果您想添加身份验证?授权?您将需要将所有这些包装在装饰器中,您的URL将很快变得混乱.

所以:

  • 视图模块应包含视图逻辑.
  • URL模块应包含URL逻辑.