django url reverse不适用于命名的url(重新编辑)找到了原因,但现在卡住了!
Posted
技术标签:
【中文标题】django url reverse不适用于命名的url(重新编辑)找到了原因,但现在卡住了!【英文标题】:django url reverse not working for named urls (re-edited) found the cause but now stuck! 【发布时间】:2011-07-02 04:16:56 【问题描述】:最新突破见底部: 我正在运行 django SVN 15632
Tried viewHallo in module core.views. Error was: 'module' object has no attribute 'viewHallo'
是我尝试reverse('home')
或reverse('admin:index')
后遇到的错误。
这是我的项目 urls.py:
from django.conf.urls.defaults import patterns, include, url
from django.contrib.staticfiles.views import serve as serveStatic
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^admin/', include(admin.site.urls)),
(r'^dbrowse/', include('dbrowse.urls')),
(r'^static/', serveStatic),
url (r'^$', 'core.views.viewHallo',name='home'),
)
这是 core\views.py
from django.shortcuts import render_to_response
from django.template.context import RequestContext
import site
def viewHallo (request):
pass
return render_to_response ('core.html',
'site':site,
'title':'i am the hallo view',
'content':'Hallo World!',,
context_instance=RequestContext(request))
使用 shell 甚至脚本 reverse('home')
和 reverse('admin:index')
都不起作用。
但是在我的模板中 % url home %
和 % url admin:index % 工作得很好......
在我的应用程序core
中,我有一个名为site.py
的文件,我使用该文件来存储有关该站点的内容,因此我不必依赖数据库。长话短说它包含reverse('home')
。现在这很重要,因为无论reverse()
在哪里执行脚本、shell 或模板,堆栈跟踪始终包含来自site.py
的行。
django 到底为什么要执行site.py
?即使确实如此,为什么它会绊倒reverse('home')
?。有趣的是,如果我将 site.py
中的行注释掉,那么 reverse()
就会开始正常工作。
怎么了??这里是core\site.py
from django.contrib.sites.models import Site
from django.conf import settings
from django.core.urlresolvers import reverse
site = Site.objects.get(pk=settings.SITE_ID)
NAME = site.name
SLOGAN = 'it\'s a deal!'
COPY_HOLDER = 'My Name'
#(link_title, 'link_address', ['permission'])
MAIN_MENU = [['home', reverse('home'), 'core.view_tender'],
['admin', reverse('admin:index'), 'is_staff']]
编辑:我已经隔离了 django 源代码中引发错误的行:
django/core/urlresolvers.py
中的第 91 行
91: lookup_view = getattr(import_module(mod_name), func_name)
它会触发 django importlib
进而导入 site.py
。
【问题讨论】:
【参考方案1】:这里有一些问题。
reverse('home')
应该完全按照您的方式工作,但您的错误发生在反向完成之前。我们必须先解决 URL conf 问题。
core.views.viewHallo
真的存在吗?
对于管理员 url,name=
不起作用,因为它是一个包含(它没有特定的 url,它只是指向另一个 url conf,所以reverse('admin')
不起作用)。
管理 url 有一个命名空间,命名空间的 url 与 namespace:named_url
反转
http://docs.djangoproject.com/en/dev/topics/http/urls/#url-namespaces
你说这是唯一有效的东西——你还想做什么?要反转其他管理 url,这里列出了一个特定的语法: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#reversing-admin-urls
url = reverse('admin:app_model_change')
如果您有任何问题,请告诉我。
【讨论】:
我知道你不能用 include 命名 url,好点!但奇怪的是它阻止了所有其他reverse()
方法的解析。不过谢谢,我又上路了!
对不起,我认为因为 % url home % 工作正常,那么 reverse('home') 也应该工作。所以不,我仍然被困住了。所以我重新编辑了这个问题。【参考方案2】:
问题是您在定义函数viewHallo
之前导入了site
模块。错误消息非常正确 - 在调用 reverse
时,模块没有这样的成员 viewHallo
。通常,模块会在需要时加载,一切都会好起来的,但在这种情况下,模块已经在加载过程中。这是 Python 模块之间存在循环依赖的情况。
【讨论】:
以上是关于django url reverse不适用于命名的url(重新编辑)找到了原因,但现在卡住了!的主要内容,如果未能解决你的问题,请参考以下文章