django url反向不工作的命名网址(重新编辑)发现原因但现在卡住了!

时间:2011-02-22 17:21:47

标签: django django-admin django-urls

查看最新突破的底部: 我正在运行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'),
)

这是核心\ 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

2 个答案:

答案 0 :(得分:1)

这里有一些问题。

reverse('home')应该完全按照你的方式工作,但是在反向完成之前你的错误就会发生。我们必须首先解决URL conf问题。

core.views.viewHallo确实存在吗?


对于管理员网址,name=无效,因为它是一个包含(没有特定的网址,只是指向另一个网址,因此reverse('admin')无效) 。

管理员网址具有命名空间,命名空间网址与namespace:named_url相反 http://docs.djangoproject.com/en/dev/topics/http/urls/#url-namespaces

你说这只是唯一的东西 - 你还想做什么?要反转其他管理员网址,此处列出了一种特定语法: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#reversing-admin-urls

url = reverse('admin:app_model_change')

如果您有任何问题,请与我们联系。

答案 1 :(得分:0)

问题是您在定义函数site之前导入viewHallo模块。错误消息非常正确 - 在调用reverse时,模块没有此类成员viewHallo。通常情况下,模块会在需要时加载,一切都会好的,但在这种情况下,模块已经处于加载过程中。这是Python模块之间存在循环依赖的情况。