You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:57:19