将views.py拆分成多个文件
我的 views.py
文件变得太大了,找不到合适的视图函数。
我该怎么把它拆分成几个文件,然后再导入呢?这样做会不会影响速度?
我可以对 models.py
也这样做吗?
10 个回答
分享一下,我在使用Vincent Demeester的回答时遇到了一些问题。其他都没问题,但在init.py文件里,我必须这样写:
__init__.py:
from .viewsa import *
from .viewsb import *
这样我就不需要在urls.py里更改我的import
方法了。我使用的是Python 3.6.1和Django 1.11.4。
我之前也做过这个(为了让大家更明白)
我做的方法是先创建一个叫 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')
当然,这里假设你在 views/year.py
里有定义了 index
和 user
这两个函数;)
在Django中,一切都是Python模块(*.py文件)。你可以创建一个视图文件夹,并在里面放一个__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
时,Python会去找view1,具体过程如下:
首先会在
views.py
中查找,这就是原始情况发生的地方。其次会在
views/__init__.py
中查找,这就是第二种情况。在这里,__init__.py
能够提供view1方法,因为它导入了这个方法。
使用这种方法,你可能不需要在urls.py
中更改import
或urlpattern
的参数。
如果你在每个新的视图文件中有很多方法,可能会觉得在views/__init__.py
中使用*
来导入会很方便,像这样:
from viewsa import *
from viewsb import *
我其实不太清楚速度方面的问题(但我怀疑没有什么影响)。
对于模型来说,可能会有点复杂。