3

我确实看到了另一个题为“如何使用 django 反转通用视图”和“django 命名 url,通用视图”的问题,但是我的问题有点不同,我不认为这是一个骗局。

代码:

from django.views.generic import list_detail, create_update
from django.core.urlresolvers import reverse
from django.conf.urls.defaults import *

partners_add = {'form_class': FooForm,
      'post_save_redirect': reverse('foo-list'),
      }


urlpatterns = patterns('',
      url(r'^foo/$', list_detail.object_list, foo_list, name='foo-list'),
      url(r'^foo/add/$', create_update.create_object, foo_add, name='foo-add'),
      )

但是,当我运行代码时,我收到错误“包含的 urlconf bar.urls 中没有任何模式”。然后,当我将 reverse('foo-list') 更改为 '/bar/foo/' 时,它可以工作。但是,如果我在模板中调用 {% url foo-list %} 我得到正确的 url 并且代码有效。

添加反向也会破坏相同 urlpatterns 中的所有 url,并出现相同的错误。

我在 Python 2.6 上运行 Django 1.1

4

4 回答 4

8

这是我在这里发现的问题的解决方案:http: //andr.in/2009/11/21/calling-reverse-in-django/

我已经粘贴了下面的代码片段,以防链接消失:

from django.conf.urls.defaults import *
from django.core.urlresolvers import reverse
from django.utils.functional import lazy
from django.http import HttpResponse

reverse_lazy = lazy(reverse, str)

urlpatterns = patterns('',
url(r'^comehere/', lambda request: HttpResponse('Welcome!'), name='comehere'),
url(r'^$', 'django.views.generic.simple.redirect_to',
{'url': reverse_lazy('comehere')}, name='root')
)
于 2010-07-16T05:47:36.413 回答
2

Django 1.4 Alpha 包含一个函数reverse_lazy来帮助解决这个问题。

于 2011-08-30T22:06:24.717 回答
1

你有一个错字——之前没有开场白post_save_redirect。另外,您是否已导入list_detail并且create_update因为您直接引用模块而不是字符串?

编辑我怀疑问题来自reverse于在partners_add字典中调用。我认为这将导致循环依赖,因为 urlconf 现在依赖于在导入 urlconf 时尚未定义的属性。

尝试删除该调用 - 可能硬编码相关的 url - 看看它是否有效。

于 2009-11-25T09:29:46.063 回答
0

一种可行的方法是包装 create_object 函数并使用 views.py 中的反向。

在 urls.py 中,代码可能如下所示:

urlpatterns = patterns('',
  url(r'^foo/$', list_detail.object_list, foo_list, name='foo-list'),
  url(r'^foo/add/$','myapp.views.my_create_object', name='foo-add'),
  )

在 myapp/views.py

from django.views.generic.create_update import create_object
from feincms.content.application.models import reverse

from forms import FooForm


def my_create_object(request):
    return create_object(request, form_class=FooForm, 
                         post_save_redirect=reverse("foo-list"))
于 2009-12-26T13:07:02.293 回答