如何在django中更改URL密码重置域?

问题描述 投票:0回答:1

在 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 %}

我想更改密码重置链接中的 {{ domain }}。我该怎么做?

python django email passwords django-class-based-views
1个回答
0
投票

由于您在子域 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 为该场景提供的功能,而无需使事情过于复杂或对其进行硬编码。

© www.soinside.com 2019 - 2024. All rights reserved.