NoReverseMatch по паролю_Reset_confirm

17

У меня возникла проблема при работе с битом 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()

Другая проблема, почему вы можете получить две электронные письма при ее сбросе, заключается в том, что вы можете иметь несколько имен пользователей, связанных с одним и тем же адресом электронной почты. Это довольно глупо. Это следующая вещь, которую я должен решить.

    
задан Houman 21.06.2012 в 19:19
источник
  • Я думаю, вы должны указать имя представления вместо имени URL-адреса. Что-то вроде {% url 'django.contrib.auth.views.password_reset_confirm' ...%} –  César 21.06.2012 в 19:55
  • Да, это сработало. Странно, потому что я скопировал это из документации Django. Теперь осталось две проблемы, см. Обновленный вопрос. спасибо –  Houman 21.06.2012 в 20:33
  • Cesar, я исправил две другие проблемы и обновил вопрос. Если вы хотите поместить свой комментарий в качестве ответа, и я буду отмечать его как ответ. благодаря –  Houman 22.06.2012 в 15:24
  • Хорошо, я сделаю это –  César 22.06.2012 в 19:13

5 ответов

4

При использовании тега шаблона url вам необходимо указать представление, а не сам URL. Поскольку вы используете 'django.contrib.auth.views.password_reset_confirm' в URLConf, вы должны использовать его следующим образом:

{% url 'django.contrib.auth.views.password_reset_confirm' ... %}

Подробнее о теге url шаблона в Django Встроенный шаблон теги и фильтры .

    
ответ дан César 22.06.2012 в 19:17
  • Поддержка аргументов строкового представления для url () устарела и была удалена в Django 1.10. Таким образом, вместо ответа @ Shih-WenSu –  kostr22 19.04.2018 в 13:31
10

Чтобы передать 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 %}
    
ответ дан Shih-Wen Su 30.04.2014 в 12:03
0

Это может быть встроенное представление, но для него по-прежнему нужен URL-адрес. Вы должны определить его в urls.py и связать его с видом password_reset_confirm .

    
ответ дан Daniel Roseman 21.06.2012 в 20:23
  • У меня уже установлен URL-адрес, см. выше .. (Если я не понял вас) Решение от Cesar работает на самом деле. Но теперь я еще не полностью. Просто обновил вопрос. спасибо –  Houman 21.06.2012 в 20:34
0

Просто скопируйте этот URL-адрес в свой основной файл urls.py, чтобы он распознал имя URL-адреса

  

URL (г '^ сброс / (Р [0-9A-Za-Z _-] +) / (Р [0-9A-Za-Z] {1,13} -? [0-9A-Za -z] {1,20}) / $»,           'Django.contrib.auth.views.password_reset_confirm',           имя = 'password_reset_confirm'),

    
ответ дан K2A 31.12.2014 в 05:50
0

Обязательно укажите это в своем urls.py:

urlpatterns = [
    url('^', include('django.contrib.auth.urls'))
]

См. Ссылка Раздел: Представления аутентификации

    
ответ дан Davy 20.01.2017 в 15:14