将 views.py 拆分为几个文件

我的 views.py已经变得太大,很难找到正确的看法。

如何将它分割成几个文件,然后导入它? 是否涉及速度损失?

我能对 models.py做同样的事情吗?

44953 次浏览

基本上,你可以把你的代码放在任何你想放的地方。只要确保相应地更改导入语句,例如对于 urls.py中的视图。

不知道实际的代码很难提出有意义的建议。也许你可以使用某种类型的文件名前缀,如 views_helper.pyviews_fancy.pyviews_that_are_not_so_often_used.py或左右..。

另一种选择是创建一个包含 __init__.pyviews目录,在该目录中导入所有 视频。如果需要大量的文件,可以随着视图的增长创建更多嵌套的子视图..。

在 Django 中,一切都是 Python 模块(* 。派)。您可以创建一个视图文件夹,其中包含 __init__.py,并且仍然可以导入视图,因为这也实现了一个 Python 模块。但举个例子会更好。

你原来的 views.py可能看起来像这样:

def view1(arg):
pass


def view2(arg):
pass

对于下面的文件夹/文件结构,它的工作原理是一样的:

views/
__init__.py
viewsa.py
viewsb.py

返回文章页面

def view1(arg):
pass

返回文章页面

def view2(arg):
pass

返回文章页面

from viewsa import view1
from viewsb import view2

快点的解释是: 当您编写 from views import view1时,Python 将在

  1. views.py,这是在第一个(原始)案例中发生的情况

  2. views/__init__.py,这就是在第二种情况下发生的情况。在这里,__init__.py能够提供 view1方法,因为它导入了 view1方法。

使用这种解决方案,您可能不需要更改 urls.py中的 importurlpattern参数

如果在每个新的视图文件中有许多方法,您可能会发现使用 *导入 views/__init__.py非常有用,如下所示:

from viewsa import *
from viewsb import *

我实际上不知道速度的问题(但我怀疑有任何问题)。

对于模特来说,这可能有点困难。

因为 Django 只希望视图是一个可调用对象,所以您可以将它放在 PYTHONPATH 中的任何位置。例如,您可以创建一个新的包 myapp.views,并将视图放入其中的多个模块中。自然,您必须更新引用这些视图调用的 urls.py 和其他模块。

答案很简单: 是的。

最好是创建一个名为 views 的目录,然后在 urls.py 中执行以下操作:

import views
...
url(r'^classroom$', views.school.klass, name="classroom"),

我以前不得不这样做(为了清楚起见)

我这样做的方法是创建一个 views目录,然后在该目录中创建一个名为 __init__.py的文件

现在,当您调用 urls.py时,您只需要添加另一部分

例如,前面可能调用了:-

url(r'^calendar/(?P<year>\d\d\d\d)/$', 'myproject.calendar.views.year')
url(r'^calendar/(?P<year>\d\d\d\d)/(?P<user>[a-z]+)/$', 'myproject.calendar.views.year_by_user')

现在可以按照

url(r'^calendar/(?P<year>\d\d\d\d)/$', 'myproject.calendar.views.year.index')
url(r'^calendar/(?P<year>\d\d\d\d)/(?P<user>[a-z]+)/$', 'myproject.calendar.views.year.user')

当然,这是假设您有包含函数 indexuserviews/year.py;)

我将几乎所有应用程序中的视图分割成一个视图文件夹(当然是使用 Init.py)。然而,我并没有像一些答案所建议的那样导入 Init.py 中的所有子视图。看起来效果不错。

我一直想把这个放进我的 Init.py:

import os


currPath = os.path.realpath(os.path.dirname(__file__))


dirFiles = []
for root, dirs, files in os.walk(currPath):
for name in files:
if name.endswith('.py') and not name.startswith('_'):
dirFiles.append(name.strip('.py'))


for f in dirFiles:
exec("from %s import %s" % (f,f))

我对 python 还是个新手,所以我还在研究它对速度/安全性/易用性的影响。

假设您有一个名为: password_generator.py的文件,那么在 views.py中添加: from password_generator import *

然后可以从 views.py调用该模块的函数。

只是为了分享,我对 Vincent Demeester 的回答有点意见。除了在 Init.py 文件中,一切都很好,我必须这样写:

_ _ init _ _. py :

from .viewsa import *
from .viewsb import *

这样我仍然不需要改变 urls.py 中的 import方法。

文森特 · 德米斯特的回答非常棒! 但是对我来说 上瘾了的回答非常有效。 我在 迁徙数据库中遇到了困难。该错误指示导入第一个模型的行,并表示无法识别我的应用程序模块。搜索了很多,但没有找到解决方案,但后来我导入了这样的模型:

from ..models import ModelName

成功了!