2009-11-25 1 views
3

Я видел другой вопрос под названием «как использовать django reverse the generic view» и «django named urls, generic views», однако мой вопрос немного отличается, и я не верю это обман.Обратный общий вид Django, post_save_redirect; error 'included urlconf does not have any patterns'

Код:

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-адрес, и код работает.

Добавление обратного будет также нарушать все URL-адреса в пределах того же URL-адреса с той же ошибкой.

Я бегу Django 1.1 на Python 2.6

ответ

1

У вас есть опечатка - нет открытия цитаты перед post_save_redirect. Кроме того, вы импортировали list_detail и create_update, так как вы обращаетесь непосредственно к модулю, а не как строки?

Edited Я подозреваю, что проблема исходит от того, вызов reverse в partners_add словаре. Я думаю, что это приведет к циклической зависимости, так как urlconf теперь зависит от атрибутов, которые еще не определены во время импорта urlconf.

Попробуйте удалить этот вызов - возможно, жесткий код соответствующего URL-адреса и посмотреть, работает ли он.

+0

Извините, опечатка из-за копирования и вставки текста в мой код. да, я импортировал list_detail и create_update. все представления работают корректно, если я просто изменяю обратную ссылку на фактический URL. – peakit

+0

См. Мои дополнительные комментарии выше. –

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")) 
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') 
)
+1

Ссылка сломана, указывает на рекламный домен. У кого есть текущая ссылка? – DarwinSurvivor

2

Django 1.4 Alpha содержит функцию reverse_lazy, чтобы помочь с этой проблемой.

+0

и вот пример использования 'reverse_lazy': http://stackoverflow.com/a/18108010/953553 – andi