Грешка в URL адрес на Django в шаблон с изглед за промяна на парола

Използвам Django 1.2.3-3+squeeze1 с Debian squeeze.

Опитвам се да използвам изгледа за промяна на паролата на Django в моето приложение, съответстващо на django.contrib.auth.views.password_change. Изглежда, че трябва да е ясно, но имам проблеми.

За простота и изчерпателност ще посоча файловете си за кандидатстване онлайн. Приложението е bixfile. Съответният Django проект е bixproj.

Съответният ред в url.py е https://bitbucket.org/faheem/bixfile/src/49bcbab3a7be/urls.py#cl-65, а именно

url(r'^password_change/$', 'django.contrib.auth.views.password_change', {'post_change_redirect':reverse('top_folders')}, name="password_change"),

Това прекъсва всеки шаблон, в който се използва. В момента го използвам само на ред https://bitbucket.org/faheem/bixfile/src/71de33d01f43/templates/calgb_base.html#cl-21 на шаблона calgb_base.html, който е включен в куп шаблони, включително изглед на индекс от най-високо ниво, съответстващ на шаблонът https://bitbucket.org/faheem/bixfile/src/71de33d01f43/templates/index.html. Редът в calgb_base.html е

<li><a class="side" href="/bg{% url password_change %}">Password Change</a></li>

Когато навигирам до горния index изглед, съответстващ на https://bitbucket.org/faheem/bixfile/src/71de33d01f43/urls.py#cl-16 и https://bitbucket.org/faheem/bixfile/src/71de33d01f43/views.py#cl-203 Виждам грешка, започваща с

Caught NoReverseMatch while rendering: Reverse for 'password_change'
with arguments '()' and keyword arguments '{}' not found.

Съмнявам се, че пълното проследяване е полезно, но го поставих на http://paste.lisp.org/display/122996.

Тази грешка може да се възпроизведе както с Apache 2.2, така и с mod-wsgi, както и с вградения тестов сървър на Django (вижте по-долу).

Ако отида директно на относителния URL адрес /password_change/, виждам формуляра за промяна на паролата, както се очаква.

Странното е, че всички тестове, които съм написал за тестване, преминават и дават очаквания резултат. Вижте например testIndexUrl , testIndexView и URL_адрес за_промяна_на_парола за тестване.

Можете да стартирате тестовете от директорията bixproj с

python manage.py test

Ако искате да опитате да възпроизведете тази грешка, това е сравнително лесно.

Първо изтеглете проекта (bixproj) и хранилищата на приложения (bixfile). Така

hg clone ssh://[email protected]/faheem/bixproj
hg clone ssh://[email protected]/faheem/bixfile

След това се уверете, че bixfile е в пътя на Python. Променете DATABASES, за да използвате sqlite. След това сменете

LOGIN_URL = '/'+BIXFILE_NAME+'/login/'
LOGIN_REDIRECT_URL= '/'+BIXFILE_NAME+'/'

to

LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL= '/'

След това бягане

python manage.py runserver

в директорията bixproj на локална машина и преминаването към URL адреса по подразбиране http://127.0.0.1:8000/ трябва да покаже грешката.

Очаквам, че мога да създам минимален пример, показващ грешката, ако е необходимо, но наистина се надявам тази грешка да е очевидна и да не се налага. Благодаря предварително.


person Faheem Mitha    schedule 28.06.2011    source източник


Отговори (1)


Вашият bixfiles.urls използва reverse. Това не е възможно, тъй като URL адресите не са били заредени при извикване на reverse.

Django 1.4 ще има функция reverse_lazy, която ще реши този проблем.

Междувременно можете:

  1. Внедрете reverse_lazy във вашия проект (вижте набор от промени 16121).
  2. Твърдо кодирайте URL адресите, вместо да използвате обратен
person Alasdair    schedule 28.06.2011
comment
@Alasdair: Опитах както reverse_lazy, така и твърдо кодиране на аргумента 'post_change_redirect' вместо да използвам reverse, както предложихте. За съжаление, нито едно от тези неща не работи. Получавам точно същата грешка като преди. Забележете, че използвам reverse по много подобен начин в urls.py точно над проблемния запис без проблеми. Тествахте ли тази предложена корекция? - person Faheem Mitha; 29.06.2011
comment
Да, тествах го. Когато замених всички обърнати URL адреси в bixfiles.urls.py с '/', индексната страница работи за мен. - person Alasdair; 29.06.2011
comment
За да изясня предишния си коментар -- вярвам, че проблемът не е reverse в шаблона на url за индексната страница, той използва reverse във всеки от вашите шаблони на url. Опитвали ли сте напълно да премахнете обратното от вашите URL адреси? При мен се получи. - person Alasdair; 29.06.2011
comment
@Alasdair: Замених reverse everywhere with reverse_lazy, per the link you posted. To define reverse_lazy` Направих from django.core.urlresolvers import reverse, from django.utils.functional import lazy, reverse_lazy = lazy(reverse, str). Работи, така че изглежда, че наистина това е бил проблемът. Благодаря ви много за помощта с това. - person Faheem Mitha; 29.06.2011
comment
Жалко е, че съобщението за грешка е толкова безполезно и не дава представа за проблема. Не може ли да се направи нещо по въпроса? Също така, документацията на 1.2 не дава намек, че reverse е проблематичен и може да причини трудни за проследяване повреди. Ако reverse_lazy решава проблема, защо не го направите по подразбиране? - person Faheem Mitha; 29.06.2011
comment
Радвам се, че работиш. Съгласен съм, че е неприятно. Не е веднага очевидно, че url адресът не съвпада, защото сте използвали обратното в URL адресите. Предложих в групата разработчиците на django да добавим допълнителен пример към документацията за lazy_reverse за използването му в URL модели. - person Alasdair; 30.06.2011