Django (v3.1) PASSWORD RESET LINK: AssertionError at line 260 of django/contrib/auth/views.py assert 'uidb64' in kwargs and 'token' in kwargs

У меня проблемы с прохождением ошибки Assertion при нажатии на ссылку сброса пароля в Django 3.1.2. У меня Django запущен в контейнере Docker.

Отправленная по электронной почте ссылка кажется правильной, поскольку она использует правильный домен 'localhost'. Однако, после нажатия на ссылку, сообщение об ошибке заменяет домен 'localhost' на 'Django:8000'.

HTML ФАЙЛЫ

password_reset_email.html

{% load i18n %}{% autoescape off %}
{% trans "You're receiving this e-mail because you requested a password reset" %}
{% blocktrans %}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 'password_reset_confirm' uidb36=uid token=token %}
{% endblock %}
{% trans "Your username, in case you've forgotten:" %} {{ user.username }}

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

{% blocktrans %}The Super Awesome team{% endblocktrans %}

{% endautoescape %}

password_reset_confirm.html

{% extends "admin/base_site.html" %}
{% load i18n %}

{% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans 'Home' %}</a> &rsaquo; {% trans 'Password reset confirmation' %}</div>{% endblock %}

{% block title %}{% trans 'Password reset' %}{% endblock %}

{% block content %}

{% if validlink %}

<h1>{% trans 'Enter new password' %}</h1>

<p>{% trans "Please enter your new password twice so we can verify you typed it in correctly." %}</p>

<form action="" method="post">
{{ form.new_password1.errors }}
<p class="aligned wide"><label for="id_new_password1">{% trans 'New password:' %}</label>{{ form.new_password1 }}</p>
{{ form.new_password2.errors }}
<p class="aligned wide"><label for="id_new_password2">{% trans 'Confirm password:' %}</label>{{ form.new_password2 }}</p>
<p><input type="submit" value="{% trans 'Change my password' %}" /></p>
</form>

{% else %}

<h1>{% trans 'Password reset unsuccessful' %}</h1>

<p>{% trans "The password reset link was invalid, possibly because it has already been used.  Please request a new password reset." %}</p>

{% endif %}

{% endblock %}

URL SCRIPT:

urls.py

auth_patterns = 
[
    path('password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'),
    re_path(r'^password_reset/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),

]

Эта AssertionError возникает из-за того, что шаблон url в ссылке для password_reset_confirm вызывает uidb36, тогда как строка 260 в файле "/root/.local/lib/python3.8/site-packages/django/contrib/auth/views.py" специально ищет кодировку uidb64.

> Строка 260: assert 'uidb64' in kwargs and 'token' in kwargs

> Исправлена ссылка на password_reset_confirm: re_path(r'^password_reset/(?P [0-9A-Za-z]+)-(?P.+)/$', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),

Обратите внимание, что после изменения ссылки подтверждения сброса пароля на uidb64, как показано ниже, соответствующее изменение также должно быть сделано в ссылке электронной почты: {{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}

Вернуться на верх