Как изменить URL домена для сброса пароля в django?

Сброс пароля в Django состоит из четырех основных этапов;

  1. Получите письмо от пользователя
  2. Отправить ссылку для сброса пароля
  3. Получить ссылку и изменить пароль со стороны пользователя
  4. Успешно зарегистрируйте новый пароль

Я использую два поддомена в своем проекте 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 предоставляет для этого сценария, не переусложняя и не перекодируя вещи.

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