Папка пользовательского шаблона регистрации 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, это нехорошо, так как это перестанет загружать любые шаблоны приложений, которые находятся в вашей виртуальной среде.

Решение состоит в том, чтобы хранить ваши регистрационные шаблоны в папке шаблонов в корне вашего проекта; не внутри какого-либо приложения: appname/templates/.

Для этого вам нужно будет добавить:

'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? - 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
Кстати, это то, что 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