1

我最近开始采用 Python 和 Django 框架。它有很多很棒的东西,也有很多我真正讨厌的东西。其中之一是views.py每个 Django 应用程序只有一个文件,我觉得这真的不切实际。所以我决定把我的观点分成多个文件。事实证明,这比我最初想象的要困难得多。

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

我原来的设置(我已经简化了,实际上还有更多的视图功能):

视图.py

def entries(request):
    ...

def delete_entry(request, id):
    ...

def categories(request):
    ...

def delete_category(request, id):
    ...

网址.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 文件。

条目.py

def entries(request):
    ...

def delete_entry(request, id):
    ...

类别.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.entriesurls.py,它实际上是一个函数,与原始设置相同。

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

4

3 回答 3

2

没有像“每个 Django 应用程序一个 views.py 文件”这样的东西。该startapp命令只是为您创建一个 views.py 文件,只是为了将代码放在某处。视图函数可以存在于任何地方,只要它在您的 Python 路径上。这意味着它必须是可导入的,因为评论表明您__init__.pyviews文件夹中可能会丢失。

编写视图

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

于 2015-06-26T14:17:40.153 回答
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'),
)
于 2015-06-26T14:32:15.920 回答
0

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

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

感谢大家的回答和评论。

于 2015-06-30T07:31:08.153 回答