Django密码重置电子邮件主题

9

我已经成功地为Django的密码重置页面添加了自定义的HTML模板,并且一切进展顺利。唯一无法解决的问题是如何包含我的电子邮件主题。

默认主题是“[我的站点名称]上的密码重置”,我可以在管理员中更改站点名称,但是否有人知道如何覆盖整个主题行?

谢谢。

3个回答

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'),

在你的your_app/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):

将保存方法重写在your_app/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])

这很有道理,我需要做些什么来覆盖默认设置吗?我已经将password_reset_subject.txt放在与其余密码重置模板相同的/registration/目录中,但它仍然使用默认主题。 - GivP
抱歉给您带来不便,我之前说错了。路径取决于TEMPLATE_DIRS设置。如果模板放置在/<one_of_your_TEMPLATE_DIRS>/auth/registration/,应该可以正常工作。 - Alexey Savanovich
谢谢Alexey,但我仍然无法使其工作。这是否适用于Django 1.3.0?因为我刚刚查看了contrib目录中的forms.py,并没有提到password_reset_subject.txt - PasswordResetForm类的save()方法没有指定password_reset_subject.txt - 主题是硬编码的。有什么想法可以覆盖它吗? - GivP
1
我刚刚更新了答案。这段代码没有经过测试,但希望你能理解其中的思路。 - Alexey Savanovich
我得到了以下错误: 异常值:'CustomPasswordResetForm'对象没有属性'users_cache'。 - Saqib Ali

1

0

PasswordResetForm会根据你的contrib.sites发送电子邮件。它获取要使用的域名并将其传递给位于registration/password_reset_email.html的HTML模板。

使用管理员或Django shell更改site

在shell中,您可以通过执行以下操作来完成此操作:

>>> 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

谢谢您的回复,但它并没有解答我的问题。我已经提到我知道如何更改contrib.sites的值,但主题仍将显示“密码重置...” - 我想知道如何更改整个主题为“更改您的密码”。 - GivP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接