Django 密码重置邮件主题

9 投票
3 回答
9516 浏览
提问于 2025-04-17 08:06

我已经成功为Django的密码重置页面添加了自己的自定义HTML模板,一切都运行得很好。唯一我搞不定的就是怎么设置我自己的邮件主题。

默认的邮件主题是“在[我的网站名称]上重置密码”,我当然可以在管理后台更改网站名称,但有没有人知道怎么完全覆盖这个主题呢?

谢谢。

3 个回答

0

PasswordResetForm 这个功能会根据你的 contrib.sites 发送邮件。它会获取你的网站域名,然后把这个域名传递给位于 registration/password_reset_email.html 的邮件模板。

你可以通过管理员界面或者 Django 的命令行工具来更改 site 的设置。

在命令行工具中,你可以这样做:

>>> from django.contrib.sites.models import Site
>>> my_site = Site(domain='your_domain.com', name='Your Domain')
>>> my_site.save()
>>> print my_site.id
2
>>>

在你的 settings.py 文件中:

SITE_ID = 2
1

这个问题大约在8个月前就修复了,但这个改动似乎没有合并到1.3.1版本中。你可以查看这里:https://github.com/django/django/commits/master/django/contrib/auth/templates

18

开发版本

只需在你的模板目录下创建一个新文件 registration/password_reset_subject.txt。这样就可以覆盖默认的 Django 邮件主题。

你可以查看这个链接了解更多信息:https://github.com/django/django/blob/master/django/contrib/auth/templates/registration/password_reset_subject.txt

还有这个链接:https://github.com/django/django/blob/master/django/contrib/auth/forms.py,特别是第150行。

在 Django 1.3 中

如果你使用国际化功能,只需在 .po 文件中添加内容。

#: forms.py:143
#, python-format
msgid "Password reset on %s"
msgstr "YOUR SUBJECT HERE %s"

如果没有,按照以下步骤操作:

在根目录的 urls.py 文件中:

# change to your custom view
(r'^password_reset/$', 'your_app.views.password_reset'),

在你的应用的 views.py 文件中:

from django.contrib.auth.views import password_reset as django_password_reset
from .forms import CustomPasswordResetForm

# reuse Django view, but change form
def password_reset(*args, **kwargs):
    kwargs['password_reset_form'] = CustomPasswordResetForm
    django_password_reset(*args, **kwargs):

重写你应用的 forms.py 中的保存方法(我知道这样做不太符合 DRY 原则,但应该能工作 :))

class CustomPasswordResetForm(PasswordResetForm):
    def save(self, domain_override=None, email_template_name='registration/password_reset_email.html',
         use_https=False, token_generator=default_token_generator, request=None):
        from django.core.mail import send_mail
        for user in self.users_cache:
            if not domain_override:
                current_site = get_current_site(request)
                site_name = current_site.name
                domain = current_site.domain
            else:
                 site_name = domain = domain_override
            t = loader.get_template(email_template_name)
            c = {
            'email': user.email,
            'domain': domain,
            'site_name': site_name,
            'uid': int_to_base36(user.id),
            'user': user,
            'token': token_generator.make_token(user),
            'protocol': use_https and 'https' or 'http',
            }
            send_mail(_("YOUR SUBJECT HERE %s") % site_name,
                t.render(Context(c)), None, [user.email])

撰写回答