在几个文件中拆分views.py

我的views.py已经变得太大了,很难find正确的观点。

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

我可以用models.py做同样的事吗?

在Django中,一切都是Python模块(* .py)。 你可以在里面创build一个带有__init__.py的视图文件夹,你仍然可以导入你的视图,因为这也实现了一个Python模块。 但是一个例子会更好。

您的原始views.py可能是这样的:

 def view1(arg): pass def view2(arg): pass 

使用以下文件夹/文件结构,它将工作相同:

 views/ __init__.py viewsa.py viewsb.py 

viewsa.py

 def view1(arg): pass 

viewsb.py

 def view2(arg): pass 

__init__.py

 from viewsa import view1 from viewsb import view2 

快速的解释是:当你from views import view1写入from views import view1 Python会查找view1

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

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

使用这种解决scheme,您可能不需要在urls.py更改importurlpattern参数

如果你在每个新的视图文件中有很多方法,你可能会发现在views/__init__.py使用* views/__init__.py这种情况,就像这样:

 from viewsa import * from viewsb import * 

我其实不知道速度问题(但我怀疑是否有)。

对于模型,可能有点困难。

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

我这样做的方式是创build一个views目录,然后,创build一个名为__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>[az]+)/$', '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>[az]+)/$', 'myproject.calendar.views.year.user') 

当然,这是假定你有包含函数indexuser views/year.py ;)

基本上,你可以把你的代码,无论你希望。 只要确保,相应地更改导入语句,例如urls.py的视图。

不知道你的实际代码很难build议一些有意义的东西。 也许你可以使用某种文件名前缀,例如views_helper.pyviews_fancy.pyviews_that_are_not_so_often_used.py左右…

另一个select是用__init__.py创build一个views目录,在这里你可以导入所有的子视图 。 如果你需要大量的文件,你可以创build更多的嵌套子视图,随着视图的增长…

简单的回答:是的。

最好是制作一个名为views的目录,然后在你的urls.py中做:

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

我将我应用程序中几乎所有的视图分割成了一个视图文件夹(当然还有一个init .py)。 然而,我并没有像init的一些答案所提示的那样导入init .py中的所有子视图。 它似乎工作得很好。

由于Django只是期望一个视图是一个可调用的对象,所以你可以把它放在你的PYTHONPATH中。 所以你可以例如只是做一个新的包myapp.views并把视图放在多个模块那里。 您自然必须更新您的urls.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的新手,所以我仍然在考虑它对速度/安全性/易用性的影响。

为了分享,文森特·德梅斯特(Vincent Demeester)的回答有点问题。 一切都很好,除了在.py文件中,我必须这样写:

__init__.py

 from .viewsa import * from .viewsb import * 

这样我仍然不需要在urls.py中更改我的import方法。 我在Python 3.6.1Django 1.11.4上

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

然后你可以从views.py调用该模块的function。