NoReverseMatch в password_Reset_confirm
У меня возникла проблема при работе с битом password_Reset_confirm.
URL:
(r'^password_reset/$', 'django.contrib.auth.views.password_reset'),
(r'^password_reset_done/$', 'django.contrib.auth.views.password_reset_done'),
(r'^password_reset_confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', 'django.contrib.auth.views.password_reset_confirm'),
password_reset_email.html, который включает в себя следующее:
{% load url from future %}
Someone asked for password reset for email {{ email }}. Follow the link below:
{{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb36=uid token=token %}
Но после отправки моего электронного письма для перепродажи пароля, я получаю это сообщение об ошибке:
NoReverseMatch at/password_reset/Реверс для 'password_reset_confirm' с аргументами '()' и ключевыми словами '{' uidb36 ':' 1 ',' токен ':' 38d-b5ec0b2a2321f522f954 '}' не найден.
Я думал, что, поскольку это использовало встроенную конструкцию, мне не нужно было ни о чем заботиться?
Спасибо за совет,
Update:
После использования полного пути это работает. Однако он отправляет два письма: каждый из них имеет другую ссылку. Почему это? И где я устанавливаю {{domain}}? Благодаря
Follow the link below:
http://example.com/password_reset_confirm/1-38d-b5ec0b2a2321f522f954/
Follow the link below:
http://example.com/password_reset_confirm/2-38d-18482e1f129c84b9c2bc/
Обновление 2
Я понял это. На всякий случай у кого-то есть эта проблема. Вам необходимо указать свое доменное имя как сайт для своего приложения:
В консоли администратора или django:
>>> my_site = Site.objects.get(pk=1)
>>> my_site.domain = 'somedomain.com'
>>> my_site.name = 'Some Domain'
>>> my_site.save()
Другая проблема, почему вы можете получить две электронные письма при ее сбросе, заключается в том, что вы можете иметь несколько имен пользователей, связанных с одним и тем же адресом электронной почты. Это довольно глупо. Это следующая вещь, которую я должен решить.
Ответы
Ответ 1
При использовании тега url
template вам нужно указать представление, а не сам URL. Поскольку вы используете 'django.contrib.auth.views.password_reset_confirm'
в URLConf, вы должны использовать его следующим образом:
{% url 'django.contrib.auth.views.password_reset_confirm' ... %}
Подробнее о теге шаблона url
в Django Документация по встроенным тегам и фильтрам.
Ответ 2
Чтобы передать URL-адрес тегу url
, вы можете указать name
для URL-адреса в urls.py
url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
views.password_reset_confirm, name='password_reset_confirm'),
а затем вы можете использовать тег с именем URL
{% url 'password_reset_confirm' uidb64=uid token=token %}
Ответ 3
Это может быть встроенное представление, но для него по-прежнему нужен URL-адрес. Вы должны определить его в urls.py и связать его с представлением password_reset_confirm
.
Ответ 4
Просто скопируйте этот URL-адрес в свой основной файл urls.py, чтобы он распознал имя URL
URL (г '^ reset/(Р [0-9A-Za-Z _-] +)/(Р [0-9A-Za-Z] {1,13} -? [0-9A -Za-Z] {1,20})/$", 'Django.contrib.auth.views.password_reset_confirm', name= 'password_reset_confirm'),
Ответ 5
Обязательно укажите это в своем urls.py:
urlpatterns = [
url('^', include('django.contrib.auth.urls'))
]
См. https://docs.djangoproject.com/en/1.8/topics/auth/default/#django.contrib.auth.views.password_reset
Раздел: Представления аутентификации