Django无法分割视图

时间:2015-06-26 13:54:12

标签: python django django-views django-1.8

我最近开始采用Python和Django框架。有很多令人敬畏的事情以及我真正讨厌的许多事情。其中一个问题是每个Django应用程序有一个views.py文件,我觉得这个文件真的不实用。所以我决定将我的观点分成多个文件。事实证明,这比我原先想象的要困难得多。

我遵循了很多问题和教程,但没有一个有效。我应该补充一点,我在ArchLinux和Django 1.8上使用Python 3.4。

我的原始设置(我简化了它,实际上有更多的视图功能):

views.py

def entries(request):
    ...

def delete_entry(request, id):
    ...

def categories(request):
    ...

def delete_category(request, id):
    ...

urls.py

from django.conf.urls import patterns, url
from transactions import views

urlpatterns = patterns('',
    url(r'^entries$', views.entries, name='entries'),
    url(r'^delete_entry(?:/(?P<id>[0-9]+)/)?$', views.delete_entry, name='delete_entry'),

    url(r'^categories$', views.categories, name='categories'),
    url(r'^delete_category(?:/(?P<id>[0-9]+)/)?$', views.delete_category, name='delete_category'),
)

我希望的状态是:

查看包含entries.py和categories.py的文件夹:

修改 在views文件夹中 init .py文件。

entries.py

def entries(request):
    ...

def delete_entry(request, id):
    ...

categories.py

same logic as above

urls.py我正在使用此设置:

from transactions.views import entries, categories
from django.conf.urls import patterns, url

urlpatterns = patterns('',
    url(r'^entries$', entries.entries, name='entries'),
    url(r'^delete_entry(?:/(?P<id>[0-9]+)/)?$', entries.delete_entry, name='delete_entry'),

    url(r'^categories$', categories.categories, name='categories'),
    url(r'^delete_category(?:/(?P<id>[0-9]+)/)?$', categories.delete_category, name='delete_category'),
)

当我尝试manage.py runserver时,ViewDoesNotExists消息会引发Could not import 'transactions.views.entries'. View is not callable.错误。当我尝试在entries.entries中转储urls.py时,它实际上是一个函数,与原始设置相同。

到目前为止,我已尝试了this问题中的大量建议,例如导入变体,浏览视图文件夹中的__init.py__,使用不带__init__.py的视图文件夹,但结果几乎相同或者有导入错误。

3 个答案:

答案 0 :(得分:2)

每个Django app&#34;都没有&#34;一个views.py文件。 startapp命令只是为您创建一个views.py文件,只是为了将代码放在某处。只要在Python路径上,视图函数就可以在任何地方生存。这意味着它必须是可导入的,因为评论表明您__init__.py文件夹中可能遗漏了views

  

Writing views

     

视图函数或简称视图只是一个Python函数   接受Web请求并返回Web响应。这种反应可以   网页的HTML内容,重定向,404错误,或   XML文档或图像。 。 。或者其他什么,真的。视图本身   包含返回它所需的任意逻辑   响应。这段代码可以在任何你想要的地方生活,只要它开启   你的Python路径。没有其他要求 - 没有“魔力”,所以   说话。为了将代码放在某处,约定是   将视图放在名为views.py的文件中,放在项目中或   应用程序目录。

答案 1 :(得分:0)

您可以尝试使用类似的方法,而不是将视图导入urls.py。

from django.conf.urls import patterns, url

urlpatterns = patterns('',
    url(r'^entries$', 'transactions.views.entries.entries', name='entries'),
    url(r'^delete_entry(?:/(?P<id>[0-9]+)/)?$', 'transactions.views.entries.delete_entry', name='delete_entry'),

    url(r'^categories$', 'transactions.views.categories.categories', name='categories'),
    url(r'^delete_category(?:/(?P<id>[0-9]+)/)?$', 'transactions.views.categories.delete_category', name='delete_category'),
)

答案 2 :(得分:0)

经过一段时间后我发现了它,发现故障发生在键盘和椅子之间:-)。问题不在于我的交易应用程序中的urls.py,而是在“主”应用程序中,django为您创建了从其他应用程序导入urls.py的位置。我已经为transaction.views.entries留下了一个url并忘记了它,所以它抱怨这个文件而我还没有看到它。

对于有类似问题的人 - 请检查你的主要urls.py!

感谢大家的回答和评论。