Django 无法拆分视图
Django unable to split views
我最近开始采用 Python 和 Django 框架。它有很多很棒的地方,也有很多我非常讨厌的地方。其中之一是每个 Django 应用程序有一个 views.py
文件,我发现这真的不切实际。所以我决定把我的观点分成多个文件。事实证明比我原先想象的要难得多。
我遵循了很多问题和教程,但其中 none 有效。我应该补充一点,我在 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'),
)
我想要的状态是:
views 文件夹包含 entries.py 和 categories.py:
编辑:是一个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
的视图文件夹,但结果非常好相同或存在导入错误。
没有什么比“每个 Django 应用程序一个 views.py 文件”更好的了。 startapp
命令只是为您创建一个 views.py 文件,只是为了将代码放在某个地方。视图函数可以存在于任何地方,只要它在您的 Python 路径上。这意味着它必须是可导入的,因为评论表明您的 views
文件夹中可能缺少 __init__.py
。
A view function, or view for short, is simply a Python function that
takes a Web request and returns a Web response. This response can be
the HTML contents of a Web page, or a redirect, or a 404 error, or an
XML document, or an image . . . or anything, really. The view itself
contains whatever arbitrary logic is necessary to return that
response. This code can live anywhere you want, as long as it’s on
your Python path. There’s no other requirement–no “magic,” so to
speak. For the sake of putting the code somewhere, the convention is
to put views in a file called views.py, placed in your project or
application directory.
您可以尝试这样的操作,而不是将视图导入 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'),
)
一段时间后我弄明白了,发现故障出在我的键盘和椅子之间:-)。问题不在于我的交易应用程序中的 urls.py,而是在 django 为您创建的 "main" 应用程序中,您可以在其中从其他应用程序导入 urls.py。我已经为 transactions.views.entries 留下了一个 url 并忘记了它,所以它抱怨这个文件但我没有看到它。
对于遇到类似问题的任何人 - 请检查您的主要 urls.py!
感谢大家的回答和评论。
我最近开始采用 Python 和 Django 框架。它有很多很棒的地方,也有很多我非常讨厌的地方。其中之一是每个 Django 应用程序有一个 views.py
文件,我发现这真的不切实际。所以我决定把我的观点分成多个文件。事实证明比我原先想象的要难得多。
我遵循了很多问题和教程,但其中 none 有效。我应该补充一点,我在 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'),
)
我想要的状态是:
views 文件夹包含 entries.py 和 categories.py:
编辑:是一个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
的视图文件夹,但结果非常好相同或存在导入错误。
没有什么比“每个 Django 应用程序一个 views.py 文件”更好的了。 startapp
命令只是为您创建一个 views.py 文件,只是为了将代码放在某个地方。视图函数可以存在于任何地方,只要它在您的 Python 路径上。这意味着它必须是可导入的,因为评论表明您的 views
文件夹中可能缺少 __init__.py
。
A view function, or view for short, is simply a Python function that takes a Web request and returns a Web response. This response can be the HTML contents of a Web page, or a redirect, or a 404 error, or an XML document, or an image . . . or anything, really. The view itself contains whatever arbitrary logic is necessary to return that response. This code can live anywhere you want, as long as it’s on your Python path. There’s no other requirement–no “magic,” so to speak. For the sake of putting the code somewhere, the convention is to put views in a file called views.py, placed in your project or application directory.
您可以尝试这样的操作,而不是将视图导入 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'),
)
一段时间后我弄明白了,发现故障出在我的键盘和椅子之间:-)。问题不在于我的交易应用程序中的 urls.py,而是在 django 为您创建的 "main" 应用程序中,您可以在其中从其他应用程序导入 urls.py。我已经为 transactions.views.entries 留下了一个 url 并忘记了它,所以它抱怨这个文件但我没有看到它。
对于遇到类似问题的任何人 - 请检查您的主要 urls.py!
感谢大家的回答和评论。