NoReverseMatch - Сброс пароля в Джанго - PullRequest
1 голос
/ 15 июня 2019

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

Я делаю страницу сброса пароля на моем сайте.Но когда я захожу на http://localhost:8000/users/reset-password и ввожу свою электронную почту и нажимаю «Сбросить мой пароль», Django выдает мне ошибку NoReverseMatch.Ошибка:

NoReverseMatch at /users/reset-password/
Reverse for 'password_reset_confirm' not found. 'password_reset_confirm' is not a valid view function or pattern name.

Я полагаю, что что-то не так с тем, как я пишу свои urlpatterns.

Я пробовал:

  • Создание собственных представлений иШаблоны.
  • Переписать все мои urlpatterns.

Мой код

urls.py :

"""Defines URL Patterns for users."""

from django.urls import re_path
from django.contrib.auth.views import (
    LoginView, PasswordResetView, PasswordResetConfirmView,
    PasswordResetDoneView,
)

from . import views

urlpatterns = [
    # Login Page.
    re_path(r'^login/$', LoginView.as_view(template_name='users/login.html'),
            name='login'),

    # Logout Page.
    re_path(r'^logout/$', views.logout_view, name='logout'),

    # Registration Page.
    re_path(r'^register/$', views.register, name='register'),

    # Password reset Page.
    re_path(r'^password_reset/$', PasswordResetView.as_view(
        # This is the only line I added in this file.
        template_name='users/password_reset_email.html'
    ),
            name='password_reset'),

    # Password reset done Page.
    re_path(r'^password_reset/done/$', PasswordResetDoneView.as_view(),
            name='password_reset_done'),

    # Password reset confirm Page.
    re_path(r'^password_reset/confirm/'
            + '(?P<uidb64>[0-9A-Za-z]+)/(?P<token>.+)/$',
            PasswordResetConfirmView.as_view(),
            name='password_reset_confirm'),
]

My собственный users/password_reset_email.html:

{% load i18n %}{% autoescape off %}
{% blocktrans %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %}

{% trans "Please go to the following page and choose a new password:" %}
{% block reset_link %}
{{ protocol }}://{{ domain }}{% url 'users:password_reset_confirm' uidb64=uid token=token %}
{% endblock %}
{% trans "Your username, in case you've forgotten:" %} {{ user.get_username }}

{% trans "Thanks for using our site!" %}

{% blocktrans %}The {{ site_name }} team{% endblocktrans %}

{% endautoescape %}

Обновление:

Я понял что-то правильно.Теперь я получаю NoReverseMatch at /users/password_reset/ Reverse for 'password_reset_confirm' with keyword arguments '{'uidb64': '', 'token': ''}' not found. 1 pattern(s) tried: ['users/password_reset/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$'].Я попал в эту ошибку, используя свой собственный шаблон djangos password_reset_email.html, где я изменил строку: {% url 'password_reset_confirm' uidb64=uid token=token %} до {% url 'users:password_reset_confirm' uidb64=uid token=token %}.Теперь я почти уверен, что просто неправильно пишу свои URL или регулярные выражения.

Я отредактировал свой вопрос, чтобы показать новый код.

1 Ответ

0 голосов
/ 18 июня 2019

Я наконец получил это.Вот ответ на проблему.

Теперь я получаю ConnectionRefusedError, что означает, что мне теперь нужно только настроить SMTP-сервер для электронной почты, и тогда он должен работать!Единственное, чего мне не хватало, так это того, что я не указывал, какой шаблон электронной почты я хотел бы использовать.Я просто установил шаблон электронной почты как шаблон , чтобы Django не мог правильно его отобразить.Вот обновленный код для urls.py, где path(r'password-reset/') изменен:

from django.urls import path, reverse_lazy
import django.contrib.auth.views as auth_views

from . import views

urlpatterns = [
    # Login Page.
    path(r'login/', auth_views.LoginView.as_view(
        template_name='users/login.html'
    ),
         name='login'),

    # Logout Page.
    path(r'logout/', views.logout_view, name='logout'),

    # Registration Page.
    path(r'register/', views.register, name='register'),

    # Password reset page.
    path(r'password-reset/', auth_views.PasswordResetView.as_view(
        email_template_name='users/password_reset_email.html',
        success_url=reverse_lazy('users:password_reset_done')
    ), name='password_reset'),

    # Password reset done page.
    path(r'password-reset/done/',
         auth_views.PasswordResetDoneView.as_view(),
         name='password_reset_done'),

    # Password reset confirm page.
    path(r'password-reset/confirm/<uidb64>/<token>/',
         auth_views.PasswordResetConfirmView.as_view(),
         name='password_reset_confirm')
]

Все остальное правильно.Я получил ответ от этого ответа .

...