在几个文件中拆分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
-
views.py
,这是发生在第一个(原始)的情况 -
views/__init__.py
,这是第二种情况。 在这里,__init__.py
能够提供view1方法,因为它导入它。
使用这种解决scheme,您可能不需要在urls.py
更改import
或urlpattern
参数
如果你在每个新的视图文件中有很多方法,你可能会发现在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')
当然,这是假定你有包含函数index
和user
views/year.py
;)
基本上,你可以把你的代码,无论你希望。 只要确保,相应地更改导入语句,例如urls.py
的视图。
不知道你的实际代码很难build议一些有意义的东西。 也许你可以使用某种文件名前缀,例如views_helper.py
, views_fancy.py
, views_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.1和Django 1.11.4上 。
假设你有一个名为: password_generator.py
的文件,那么在views.py
添加: from password_generator import *
然后你可以从views.py
调用该模块的function。