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(重新编辑)找到了原因,但现在卡住了!的主要内容,如果未能解决你的问题,请参考以下文章

用于 JavaScript 的 Django reverse()

嵌套 url 不适用于 Django REST 框架

Django知识点

AJAX 不适用于 Django 应用程序

Django REST 框架:令牌身份验证不适用于生产

数据库中的待办事项列表项更新不适用于 Django