Django:分解视图
这实际上只是一个“最佳实践”问题 我发现在开发一个应用程序时,我经常会得到很多视图Django:分解视图,django,django-views,Django,Django Views,这实际上只是一个“最佳实践”问题 我发现在开发一个应用程序时,我经常会得到很多视图 将这些视图分解为多个视图文件是常见做法吗?换句话说。。。不只是拥有views.py,拥有views\u 1.py、views\u 2.py、views\u 3.py(但可能按类别命名更为恰当)是否很常见?作为一个一般准则,考虑一下可读性和可维护性:默认的“views.py”这只是最初搭建的一个建议——你不必坚持 通常,包含数千行代码的文件很难维护,因此我通常尝试将较大的模块分解为较小的模块。 另一方面,这种划分应
将这些视图分解为多个视图文件是常见做法吗?换句话说。。。不只是拥有views.py,拥有views\u 1.py、views\u 2.py、views\u 3.py(但可能按类别命名更为恰当)是否很常见?作为一个一般准则,考虑一下可读性和可维护性:默认的“views.py”这只是最初搭建的一个建议——你不必坚持 通常,包含数千行代码的文件很难维护,因此我通常尝试将较大的模块分解为较小的模块。
另一方面,这种划分应该是有意义的——将相关函数拆分为多个文件,大量导入可能会使维护更加困难 最后,您还可以考虑完全其他的方法来简化您的应用程序。
你看到重复的代码了吗?也许某些功能可以在完全不同的应用程序中移动?等等。拆分
views.py
您的大多数代码可能希望您的视图可以作为myapp.views.viewname
访问。我看到人们分解视图但保留python名称的一种方法是创建一个views/
目录<代码>视图/_初始化/.py将具有:
from .foo_views import *
from .bar_views import *
from .baz_views import *
然后,在视图/foo_views.py
中,放入:
def foo_detail(request, ...):
# your code here
def foo_list(request, ...):
# your code here
def your_other_view(...):
# ...
因此,您将所有内容从views.py
移动到此目录中的文件中,制作\uuuu init\uuuuu.py
,删除views.py
,就完成了
然后,当您导入myapp.views时,myapp.views.foo_detail
将引用您在views/foo_views.py
中定义的函数
拆分其他模块
此策略也适用于admin.py
等。但是如果您想像这样拆分models.py
,则需要将app\u label='your\u app\u name'
添加到所有模型的类Meta:
中。例如,unicorn\u app/models/unicorns.py
可以有如下条目:
class Unicorn(models.Model):
description = models.CharField(max_length=80)
class Meta:
app_label = 'unicorn_app'
(否则,Django设想,
Unicorn
模型是Django名为“模型”的应用程序的一部分,这会弄乱管理站点。当前版本为1.6-)另一个选项是将部分功能移动到一个或多个应用程序中。这将允许您同时移动表单和模板,并保持结构化。您不必移动模型,这样可以避免模型和数据迁移
例如,您可以具有以下结构:
main_app/
|_models.py
|_views.py
|_forms.py
|_urls.py
|_templates/
sub_app_1/
|_views.py
|_forms.py
|_urls.py
|_templates/
sub_app_2/
|_views.py
|_forms.py
|_urls.py
|_templates/
我喜欢这种方法。唯一的问题是,现在我需要在从应用程序导入其他内容时放置完整路径。例如,在我可以执行“从模型导入*”之前。现在我需要执行“从project.app.models导入*”。有没有办法解决这个问题?你可以做相对导入。我从未尝试过它们,它们看起来有点棘手,但这里有一个相关的SO问题:附录-包含
\uuuu init\uuuuuuy.py
文件的目录称为“包”。我意识到这是一个古老的答案。但还有一个问题。“”“因此,您将所有内容从views.py移动到此目录中的文件中,生成init.py,删除views.py,就完成了。然后,当您导入myapp.views时,myapp.views.foo_detail将引用您在views/foo_views.py中定义的函数。”“这会通过导入然后导入来创建任何类型的性能影响吗,等等?Python模块是缓存的,所以虽然每次应用程序重启时可能会稍微慢一点,但之后也应该一样快。但与构建web应用程序时所做的其他设计决策相比,任何差异都应该非常小。我知道其他人在说什么,但我更喜欢这个。它在你的应用程序中的主题之间形成完整的想法+谢谢。