Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:分解视图_Django_Django Views - Fatal编程技术网

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应用程序时所做的其他设计决策相比,任何差异都应该非常小。我知道其他人在说什么,但我更喜欢这个。它在你的应用程序中的主题之间形成完整的想法+谢谢。