基于 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
,没关系。
刚刚完成一些 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
,没关系。