如何在Django中修改密码重置链接的域名?
问题描述
我的Django项目使用两个子域名,密码重置的前两步(接收邮件请求、发送重置链接)在其中一个子域名完成,后两步(修改密码、设置成功)需要在另一个子域名进行。我已经自定义了密码重置视图类,并且使用默认的邮件模板,但需要修改邮件中重置链接的{{ domain }}值,换成目标子域名。
自定义视图代码:
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): # 从URL参数中获取用户名 self.username = kwargs.get('username') if not self.username: raise Http404("URL中未提供用户名。") return super().dispatch(request, *args, **kwargs)
邮件模板代码:
{% load i18n %}{% autoescape off %} {% blocktranslate %}你收到这封邮件是因为你在 {{ site_name }} 请求重置用户账户密码。{% endblocktranslate %} {% translate "请访问以下页面并设置新密码:" %} {% block reset_link %} {{ protocol }}://{{ domain }}{% url 'auth_staff:password_reset_confirm' uidb64=uid token=token %} {% endblock %} {% translate "你的用户名(以防你忘记):" %} {{ user.get_username }} {% translate "感谢使用我们的网站!" %} {% blocktranslate %}{{ site_name }} 团队{% endblocktranslate %} {% endautoescape %}
解决方案
可以通过以下几种方式修改重置链接中的域名:
方法一:重写视图的get_domain方法
在自定义视图中添加get_domain方法,直接返回目标子域名,覆盖父类的默认逻辑:
class CustomPasswordResetView(PasswordResetView): # 原有代码... def get_domain(self, request): # 返回你需要的目标子域名,例如"reset.example.com" return "reset.example.com"
这样邮件模板里的{{ domain }}就会自动使用你返回的子域名。
方法二:直接修改邮件模板
如果域名是固定值,不需要动态调整,直接在模板里替换{{ domain }}为目标子域名即可:
{% block reset_link %} {{ protocol }}://reset.example.com{% url 'auth_staff:password_reset_confirm' uidb64=uid token=token %} {% endblock %}
这种方式最简单,但灵活性较差,适合域名固定的场景。
方法三:重写send_mail方法传递自定义域名
如果需要根据不同场景动态调整域名,可以重写视图的send_mail方法,在上下文里替换域名:
class CustomPasswordResetView(PasswordResetView): # 原有代码... def send_mail(self, subject_template_name, email_template_name, context, from_email, to_email): # 替换上下文里的domain为目标子域名 context['domain'] = "reset.example.com" # 可以根据用户类型等条件动态设置域名,比如: # if self.username.startswith('admin'): # context['domain'] = "admin-reset.example.com" super().send_mail(subject_template_name, email_template_name, context, from_email, to_email)
这种方式支持动态调整域名,适合多场景的需求。
内容的提问来源于stack exchange,提问作者cosmoscoder
相关产品推荐
相关产品推荐

