【问题标题】:The included urlconf manager.urls doesn't have any patterns in it包含的 urlconf manager.urls 中没有任何模式
【发布时间】:2011-09-22 21:05:30
【问题描述】:

解决方案: 发现以下 django sn-p 似乎工作正常 (http://djangosnippets.org/snippets/2445/)

from django.utils.functional import lazy
from django.core.urlresolvers import reverse

#Workaround for using reverse with success_url in class based generic views
#because direct usage of it throws an exception.

reverse_lazy = lambda name=None, *args : lazy(reverse, str)(name, args=args)

显然,django 主干中现在有一个reverse_lazy 函数。


更新:此错误与我在通用视图中调用 reverse 相关:

class AddObjView(CreateView):
    form_class = ObjForm
    template_name = 'manager/obj_add.html'
    success_url = reverse('manager-personal_objs')

这无效吗?

如果我写这样的东西而不是通用的,它会起作用:

def add_obj(request, pk):
    a=reverse('manager-personal-objs')
    return HttpResponse(a)

我有一个项目,其中包含 2 个应用程序。每个应用程序都有其 url 和视图。它们都工作正常,但是在管理器应用程序上,只要我在视图(任何视图)中引用反向函数,我就会收到以下错误: 异常类型:配置不当 异常值:包含的 urlconf manager.urls 中没有任何模式

网址文件:

urlpatterns = patterns('',
    url(r'^$', ObjView.as_view(), name='manager-obj'),
    url(r'^add/$', AddObjView.as_view(), name='manager-add_obj'),
    url(r'^personal/$', PersonalObjsView.as_view(), name='manager-personal_objs'),    

)

异常位置:...site-packages\django\core\urlresolvers.py 在 _get_url_patterns,第 283 行

我在整个站点中都收到此错误(编辑:这显然是因为尝试导入 manager.urls 会导致错误)。如果我删除包含 manager.urls,一切都会恢复工作;如果我取消调用reverse,一切都很好;如果我尝试将 manager.urls 重写为更简单的版本,则会继续出现错误。

我已经经历了很多次,似乎找不到任何问题。

edit:root urls.py

# coding=utf8
from django.conf.urls.defaults import patterns, include, url
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.views.generic.simple import direct_to_template

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Uncomment the admin/doc line below to enable admin documentation:
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),

    # Home Page
    url(r'^$', direct_to_template, {'template': 'home.html'}, name="home"),

    # manager
    url(r'^manager/', include('manager.urls')),

    # writing
    url(r'^writing/', include('writing.urls')),
)

urlpatterns += staticfiles_urlpatterns()

edit2:还应注意,url 模板标签在管理器应用程序中工作正常,如果我在其他应用程序上执行反向调用,则可以正常工作。 此外,每个 url 都有一个书面的工作视图。

【问题讨论】:

  • 你能把你的根urls.py也贴出来吗?
  • 我经常对我的模式做的一件事就是把最具体的模式放在第一位。我会把主页模式放在静态文件模式之后,我会颠倒顺序或你的 manager.url 模式。
  • 好吧,我重新安排了它,因为我通常自己做,但这没有任何区别。

标签: django django-urls


【解决方案1】:

问题是在基于类的视图尝试反转 URL (AddObjView.success_url) 之前,您的 URLConf 尚未完成加载。如果您想在基于类的视图中继续使用反向,您有两种选择:

a) 您可以为您的班级创建一个 get_success_url() 方法,然后从那里执行相反的操作

class AddObjView(CreateView):
    form_class = ObjForm
    template_name = 'manager/obj_add.html'

    def get_success_url():
        return reverse('manager-personal_objs')

b) 如果你运行的是 Django 的 trunk/dev 版本,那么你可以使用 reverse_lazy https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-lazy

from django.core.urlresolvers import reverse_lazy

class AddObjView(CreateView):
    form_class = ObjForm
    template_name = 'manager/obj_add.html'
    success_url = reverse_lazy('manager-personal_objs')

选项“b”是在未来版本的 Django 中执行此操作的首选方法。

【讨论】:

  • reverse_lazy 包含在 Django 1.4 中。感谢@erikow 指出这一点。
  • +1 for reverse_lazy,你必须重启开发服务器才能生效
  • django-nonrel (1.3) with appengine DOES NOT HAVE reverse_lazy
  • 这就是我的想法,因为我的项目的其他部分也使用了相同的反向语句。
  • 如果您不幸使用 django 1.3 或更低版本,您可以将其添加到您的代码中:reverse_lazy = lazy(reverse, str)
猜你喜欢
  • 2014-07-03
  • 2013-07-15
  • 2011-03-01
  • 2013-07-05
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
相关资源
最近更新 更多