将views.py拆分成多个文件

180 投票
10 回答
50203 浏览
提问于 2025-04-15 17:08

我的 views.py 文件变得太大了,找不到合适的视图函数。

我该怎么把它拆分成几个文件,然后再导入呢?这样做会不会影响速度?

我可以对 models.py 也这样做吗?

10 个回答

17

分享一下,我在使用Vincent Demeester的回答时遇到了一些问题。其他都没问题,但在init.py文件里,我必须这样写:

__init__.py:

from .viewsa import *
from .viewsb import *

这样我就不需要在urls.py里更改我的import方法了。我使用的是Python 3.6.1Django 1.11.4

24

我之前也做过这个(为了让大家更明白)

我做的方法是先创建一个叫 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 里有定义了 indexuser 这两个函数;)

233

在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,具体过程如下:

  1. 首先会在views.py中查找,这就是原始情况发生的地方。

  2. 其次会在views/__init__.py中查找,这就是第二种情况。在这里,__init__.py能够提供view1方法,因为它导入了这个方法。

使用这种方法,你可能不需要在urls.py中更改importurlpattern的参数。

如果你在每个新的视图文件中有很多方法,可能会觉得在views/__init__.py中使用*来导入会很方便,像这样:

from viewsa import *
from viewsb import *

我其实不太清楚速度方面的问题(但我怀疑没有什么影响)。

对于模型来说,可能会有点复杂。

撰写回答