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

Django Class Based Views - is it bad style to put all code in urls.py?

刚刚完成一些 CBV 工作,想知道这是否是一种糟糕的风格。通常,对于该视图,您的 views.py 中有一个 class,urls.py 中有一个 URL。类似于:

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 中的多余代码,这不是很好吗?或者这是以牺牲清晰度为代价的减少?

将视图逻辑排除在 URLConfs 之外要好得多。 乍一看 url(r'contacts/$', ListView.as_view(model=Contact)) 似乎没问题,但实际上它违反了 Django 的设计哲学:

  • url、视图、模型之间的松散耦合已替换为紧密耦合,因此现在您无法重用视图。
  • URLs 的灵活性被破坏。继承,CBV 的主要优点是不可能在 URL 秒内使用它们。
  • 很多其他的事情,例如如果你想添加身份验证怎么办?授权?您需要将所有这些包装在装饰器中,您的 URL 很快就会变得凌乱。

所以:

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

答案是:视情况而定。

如果你正在编写一个非常小的应用程序,你知道,它不会变大,那么没关系,除非你无法抗拒代码的味道,你实际上可以在一个文件,检查这个 SO 问题的答案,例如 How do I write a single-file Django application?

P.S:这个问题是普遍存在的,绝不是 Django 特有的。

嗯,"reducing excess code in views.py"当然不是原因。如果你打算用几个简单的参数实例化通用视图,你可以将它保留在 urls.py 中,只要它适合你。当它不再起作用时,也许将其移动到 views.py 或将视图作为一个模块并将其移动到 views/someview.py,没关系。