Включенный urlconf manager.urls не содержит шаблонов.

Решение: найден следующий фрагмент кода django, который работает нормально (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. багажник.


Обновление: эта ошибка как-то связана с тем, что я вызываю реверс внутри общего представления:

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)

У меня есть проект с двумя приложениями. Каждое приложение имеет свои URL-адреса и представления. Они оба работают нормально, но в приложении-менеджере, как только я ссылаюсь на обратную функцию в представлениях (любое представление), я получаю следующую ошибку: Тип исключения: Неправильно сконфигурированное значение исключения: включенный urlconf manager.urls не имеет любые узоры в нем

Файл URL:

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 приведет к ошибке). Если я удалю include manager.urls, все вернется к работе; если убрать вызов реверса, то все нормально; если я попытаюсь переписать manager.urls на более простую версию, он продолжит с ошибкой.

Я проходил это много раз, не могу найти ничего плохого.

изменить: корневой 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-адрес имеет письменное рабочее представление.


person Ricardo B.    schedule 26.06.2011    source источник
comment
Можете ли вы также опубликовать свой корень urls.py?   -  person Ismail Badawi    schedule 26.06.2011
comment
Одна вещь, которую я всегда делаю со своими паттернами, — это ставлю наиболее специфические паттерны на первое место. Я бы поместил шаблоны домашней страницы после шаблонов статических файлов и изменил бы порядок или шаблоны вашего manager.url.   -  person Brandon    schedule 26.06.2011
comment
Ну, я переставил его, потому что обычно делаю это сам, но это не имеет никакого значения.   -  person Ricardo B.    schedule 26.06.2011


Ответы (1)


Проблема в том, что ваша URLConf не закончила загрузку до того, как ваше представление на основе класса попытается изменить URL-адрес (AddObjView.success_url). У вас есть два варианта, если вы хотите продолжать использовать reverse в своих представлениях на основе классов:

а) Вы можете создать метод get_success_url() для своего класса и сделать обратное оттуда

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

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

б) Если вы работаете в версии Django для магистрали/разработчика, вы можете использовать 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.

person erikcw    schedule 24.10.2011
comment
reverse_lazy включен в Django 1.4. Спасибо @erikow за указание на это. - person Josh; 31.07.2012
comment
+1 для reverse_lazy, вам нужно перезапустить сервер разработки, чтобы он вступил в силу - person cerberos; 20.10.2012
comment
django-nonrel (1.3) с appengine НЕ ИМЕЕТ reverse_lazy - person jmoz; 13.11.2012
comment
Я так и думал, поскольку тот же обратный оператор работал в других частях моего проекта. - person Amyth; 26.04.2013
comment
И если вам не повезло, что вы используете django 1.3 или меньше, вы можете добавить это в свой код: reverse_lazy = lazy(reverse, str) - person webtweakers; 23.07.2013