Как изменить URL домена для сброса пароля в django?
Сброс пароля в Django состоит из четырех основных этапов;
- Получите письмо от пользователя
- Отправить ссылку для сброса пароля
- Получить ссылку и изменить пароль со стороны пользователя
- Успешно зарегистрируйте новый пароль
Я использую два поддомена в своем проекте django. Первые два шага (1 & 2) должны выполняться в одном поддомене, а следующие два шага (3 & 4) - в следующем поддомене
Я получаю класс сброса пароля, чтобы внести некоторые изменения:
class CustomPasswordResetView(PasswordResetView):
template_name = "registration/password/password_set_form.html"
email_template_name = "registration/password/password_set_email.html"
subject_template_name = "registration/password/password_set_subject.html"
success_url = reverse_lazy('auth_staff:password_reset_done')
def dispatch(self, request, *args, **kwargs):
# Retrieve the username from the URL kwargs
self.username = kwargs.get('username')
if not self.username:
raise Http404("Username not provided in the URL.")
return super().dispatch(request, *args, **kwargs)
и это стандартный файл password_set_email.html:
{% load i18n %}{% autoescape off %}
{% blocktranslate %}You're receiving this email because you requested a password set for your user account at {{ site_name }}.{% endblocktranslate %}
{% translate "Please go to the following page and choose a new password:" %}
{% block reset_link %}
{{ protocol }}://{{ domain }}{% url 'auth_staff:password_reset_confirm' uidb64=uid token=token %}
{% endblock %}
{% translate 'Your username, in case you’ve forgotten:' %} {{ user.get_username }}
{% translate "Thanks for using our site!" %}
{% blocktranslate %}The {{ site_name }} team{% endblocktranslate %}
{% endautoescape %}
Я хочу изменить {{домен }} в ссылке сброса пароля. Как я могу это сделать?
Поскольку вы создаете письмо на субдомене A, но {{domain}}
должен содержать адрес субдомена B, вам нужно переопределить {{domain}}
часть письма.
Вы можете переопределить шаблон с помощью собственного шаблона и полужесткого кода, но я бы не рекомендовал этого делать, если впоследствии вы захотите использовать другой подход.
Другой вариант, который я нашел, просматривая исходный код, - это переопределение метода сохранения PasswordResetForm
. Глядя на исходный код, кажется, что он получает аргумент domain_override
, который вы можете указать на поддомен B. Это, вероятно, будет выглядеть примерно так
class CustomPasswordResetForm(PasswordResetForm):
def save(*args, **kwargs):
domain_override = kwargs.pop('domain_override', 'subdomain B')
super().save(domain_override=domain_override, *args, **kwargs)
Затем на вашем представлении просто установите это в качестве form_class
class CustomPasswordResetView(PasswordResetView):
...
form_class = CustomPasswordResetForm
Таким образом вы используете то, что Django предоставляет для этого сценария, не переусложняя и не перекодируя вещи.