【问题标题】:Django unable to split viewsDjango 无法拆分视图
【发布时间】:2015-09-13 12:27:14
【问题描述】:

我最近开始采用 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文件。

entry.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 时,Could not import 'transactions.views.entries'. View is not callable. 消息会引发ViewDoesNotExists 错误。当我尝试将entries.entries 转储到urls.py 时,它实际上是一个函数,与原始设置相同。

到目前为止,我已经尝试了来自this 问题的许多建议,例如导入变体、在视图文件夹中破解__init.py__、使用没有__init__.py 的视图文件夹,但结果几乎相同或存在导入错误。

【问题讨论】:

  • views 文件夹中有名为__init__.py 的文件吗?
  • __init__.py放到views文件夹中。
  • 错误Could not import 'transactions.views.entries' 与您的新 urls.py 和视图布局不匹配。确保您已删除所有旧的 pyc 文件,并重新启动服务器。
  • @giaosudau 很抱歉回复晚了,有一段时间没有在我的电脑上。我确实在视图目录中有一个 init.py 文件(尝试使用和不使用它,尝试在 init.py 中导入视图,但没有成功)。
  • @Alasdair 我尝试删除项目中的所有 *.pyc 文件和所有 pycache 目录。仍然没有运气 - 同样的错误。我也很奇怪,路径是模块的,而不是函数的。如果我尝试转储entrys.entries,它会正确显示

标签: python django django-views django-1.8


【解决方案1】:

没有什么能比得上“每个 Django 应用一个views.py 文件”。 startapp 命令只是为您创建一个 views.py 文件,只是为了将代码放在某处。视图函数可以存在于任何地方,只要它在您的 Python 路径上。这意味着它必须是可导入的,因为 cmets 建议您的 views 文件夹中可能缺少 __init__.py

Writing views

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

【讨论】:

  • 另外,我建议将所有视图导入__init__.py,以便抽象出视图的实际布局。例如,我认为 urlconf 文件应该只是导入 myapp.views 而不知道底层文件。
  • 我确实有一个 init.py 文件(抱歉,不清楚),我也尝试在 init 文件中进行导入,但这也不起作用 - 同样结果。
【解决方案2】:

您可以尝试这样的方式,而不是将视图导入 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'),
)

【讨论】:

  • 支持字符串视图参数is deprecated,所以我不推荐它用于新项目。
  • 我已经尝试过了,但没有运气,仍然是同样的消息:-(
【解决方案3】:

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

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

感谢大家的回答和cmets。

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多