我最近开始采用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
的视图文件夹,但结果几乎相同或者有导入错误。
答案 0 :(得分:2)
每个Django app&#34;都没有&#34;一个views.py文件。 startapp
命令只是为您创建一个views.py文件,只是为了将代码放在某处。只要在Python路径上,视图函数就可以在任何地方生存。这意味着它必须是可导入的,因为评论表明您__init__.py
文件夹中可能遗漏了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!
感谢大家的回答和评论。