Персонализираната папка за шаблон за регистрация на Django 1.8 вече не работи

Надстройвам един от моите проекти до Django 1.8.3 и едно от малкото предизвикателства е, че Django вече няма достъп до персонализираните ми шаблони за регистрация.

Въз основа на това: https://stackoverflow.com/a/19226149/3390630 Имам своите персонализирани регистрационни файлове в моя appname/templates/registration папка.

Тъй като Django направи някои големи промени в начина, по който вече се осъществява достъп до шаблоните, Django 1.8 вече не търси моите персонализирани регистрационни файлове и получавам тази грешка:

NoReverseMatch at /resetpassword/
Reverse for 'password_reset_done' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

Опитах се да добавя следните зареждащи програми към настройките на TEMPLATES, но без успех.

'loaders': [
            'django.template.loaders.app_directories.Loader',
            'django.template.loaders.filesystem.Loader',
        ]

Също така използвам персонализиран urls за login, logout, password reset и т.н.

Моите URL адреси

...
url(r'^resetpassword/$', 'django.contrib.auth.views.password_reset', name='password_reset'),
url(r'^resetpassword/passwordsent/$', 'django.contrib.auth.views.password_reset_done', name='password_reset_done'),
url(r'^reset/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', 'django.contrib.auth.views.password_reset_confirm', name='password_reset_confirm'),
url(r'^reset/done/$', 'django.contrib.auth.views.password_reset_complete', name='password_reset_complete'),
...

Някакви предложения как да накарам Django отново да търси в персонализираната ми папка?


person WayBehind    schedule 13.07.2015    source източник


Отговори (3)


И аз се борих с този проблем. Предложеното решение: промяна на „APP_DIRS“: False, не е добре, тъй като ще спре да зарежда всички шаблони на приложения, които са във вашата виртуална среда.

Решението е да запазите регистрационните си шаблони в папката шаблони в корена на вашия проект; не в нито едно приложение: име на приложение/шаблони/.

За това ще трябва да добавите:

'DIRS': [os.path.join(BASE_DIR, 'templates')], 

в дефиницията на шаблони във файла с настройки.

Вторият проблем, с който може да се сблъскате, че все още след като направите това, за шаблон за забравена парола ще зареди Django администраторски шаблон, за това: поставете „registration“ преди „django.contrib.admin“ в INSTALLED_APPS във файла с настройки.

INSTALLED_APPS = (
    'registration',
    'django.contrib.admin',
person varnothing    schedule 10.12.2015
comment
Поръчката от INSTALLED_APPS артикула беше проблем за мен. Благодаря. Противоинтуитивно е, че предишните елементи имат предимство пред това, което следва - обосновката обяснена ли е някъде в django docs? - person michela; 28.02.2016
comment
Трябва да има нещо с реда django да чете директорията с шаблони на приложението. Съжалявам; не можах да намеря никаква документация. - person varnothing; 29.02.2016

В Django методът reverse() се използва за обръщане на име, удобно за четене име, за да съответства на URL модел. Тук вашият регулярен израз '^resetpassword/$' няма име, което да бъде обърнато. Добавете параметъра name='password_reset_done' към вашия URL адрес. Нещо като,

    url(r'^resetpassword/$', 'django.contrib.auth.views.password_reset', {'post_reset_redirect': reverse_lazy('auth_password_reset_done'), 
name='password_reset_done'), #Where 'auth_password_reset_done' is where you want to redirect post form submission on the reset page.

Освен това трябва да преформатирате вашите URL конфигурации, тъй като им липсват няколко основни параметъра, до нещо подобно,

url(r'^password/reset/$',
   auth_views.password_reset,
   {'post_reset_redirect': reverse_lazy('auth_password_reset_done'), 
   'template_name': 'registration/password_reset.html'},
   name='auth_password_reset'),

url(r'^password/reset/confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$',
   auth_views.password_reset_confirm,
   {'post_reset_redirect': reverse_lazy('auth_password_reset_complete'),
   'template_name' : 'registration/reset_confirm.html'},
   name='auth_password_reset_confirm'),

url(r'^password/reset/complete/$',
   auth_views.password_reset_complete,
   {'post_reset_redirect': reverse_lazy('auth_password_reset_complete'), 
    'template_name' : 'reset_complete'},
   name='auth_password_reset_complete'),

url(r'^password/reset/done/$',
   auth_views.password_reset_done,
   {'template_name': 'registration/reset_done.html'},
   name='auth_password_reset_done'),
person Sentient07    schedule 13.07.2015
comment
Благодаря ви за предложението. Добавих липсващия name='password_reset_done', но все още получавам същата грешка. Някакви други предложения? - person WayBehind; 13.07.2015
comment
BTW това е, което Django има в auth URL адресите url(r'^password_reset/$', views.password_reset, name='password_reset'), - person WayBehind; 13.07.2015
comment
@WayBehind: това е вашият проблем, нали, stackoverflow .com/questions/20307473/ ? - person Sentient07; 13.07.2015
comment
Както и да е, ако искате да обърнете низ, валидно съпоставяне на шаблон на URL към изглед трябва да има този низ като име, в противен случай ще има грешка NoReverseMatch - person Sentient07; 13.07.2015
comment
Благодаря ти за линка. За съжаление все още няма късмет. Актуализирах своята OP с четирите URL адреса, които използвам, и получавам грешка. - person WayBehind; 13.07.2015
comment
@WayBehind Все още ли получавате абсолютно същата грешка? Можете ли да поставите обратното проследяване? - person Sentient07; 13.07.2015
comment
Нека продължим тази дискусия в чата. - person Sentient07; 13.07.2015

Това е, което трябваше да направя, за да стартирам персонализираната папка Registration.

  1. Преместих URLs от моя app/urls.py в project/urls.py
  2. Променете TEMPLATES в settings.py на 'APP_DIRS': False,

Надявам се това да е полезно за други и благодаря на @Sentient07, че ме насочи в правилната посока!

person WayBehind    schedule 13.07.2015