在几个文件中拆分views.py.

bar*_*rin 144 python django

views.py变得太大了,很难找到正确的观点.

如何将其拆分为多个文件然后导入?它涉及任何速度损失吗?

我可以这样做models.py吗?

Vin*_*ter 178

在Django中,一切都是Python模块(*.py).您可以使用__init__.py内部创建视图文件夹,但仍然可以导入视图,因为这也实现了Python模块.但是一个例子会更好.

您的原件views.py可能如下所示:

def view1(arg):
    pass

def view2(arg):
   pass
Run Code Online (Sandbox Code Playgroud)

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

views/
   __init__.py
   viewsa.py
   viewsb.py
Run Code Online (Sandbox Code Playgroud)

viewsa.py :

def view1(arg):
    pass
Run Code Online (Sandbox Code Playgroud)

viewsb.py :

def view2(arg):
    pass
Run Code Online (Sandbox Code Playgroud)

__init__.py :

from viewsa import view1
from viewsb import view2
Run Code Online (Sandbox Code Playgroud)

快速的解释是:当你写from views import view1的Python会寻找在厂景

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

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

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

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

from viewsa import *
from viewsb import *
Run Code Online (Sandbox Code Playgroud)

我实际上不知道速度问题(但我怀疑有没有).

对于模型,它可能有点困难.

  • 这个解决方案对我不起作用(与@ChrisMiller相同的错误.我的解决方案:在`__init __.py`:`来自myapp.views.viewsa import*`.请注意,你不能再拥有views.py了(或者至少它不会被读取@ShiftNTab:在views.py中找不到你的意见时出错.希望它有所帮助! (5认同)
  • 你可以在你的例子中添加一个与view1或view2匹配的url模式吗?因为我有问题.... (2认同)
  • 我尝试这样做,但是当我去导入我的模型时(从app.models导入MyModel或从模型导入MyModel),Python抱怨该模型不存在. (2认同)
  • 我必须使用句点: from .viewsa import * ——如果这是一个普遍的问题/解决方案,那么可能值得更正答案。 (2认同)

Mez*_*Mez 20

我以前必须这样做(为了清楚起见)

我这样做的方法是创建一个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')
Run Code Online (Sandbox Code Playgroud)

你现在可以调用一些东西

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')
Run Code Online (Sandbox Code Playgroud)

当然,这是假设您已views/year.py包含函数indexuser;)


mik*_*iku 9

基本上,您可以根据需要放置代码.只需确保,您可以相应地更改导入语句,例如,对于视图中的视图urls.py.

不知道你的实际代码很难建议有意义的东西.也许你可以使用某种类型的文件名前缀,例如views_helper.py,views_fancy.py,views_that_are_not_so_often_used.py或使...

另一种选择是使用a创建一个views目录__init__.py,您可以在其中导入所有子视图.如果您需要大量文件,则可以在视图增长时创建更多嵌套子视图...


add*_*ted 8

仅仅为了分享,我对Vincent Demeester的回答有些疑问.一切都很好,除了在init .py文件中,我必须这样写:

__init__.py:

from .viewsa import *
from .viewsb import *
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*son 5

简单回答:是的.

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

import views
...
url(r'^classroom$', views.school.klass, name="classroom"),
Run Code Online (Sandbox Code Playgroud)