在 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 %}
我想更改密码重置链接中的 {{ domain }}。我该怎么做?
由于您在子域 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 为该场景提供的功能,而无需使事情过于复杂或对其进行硬编码。