Django 密码重置邮件主题
我已经成功为Django的密码重置页面添加了自己的自定义HTML模板,一切都运行得很好。唯一我搞不定的就是怎么设置我自己的邮件主题。
默认的邮件主题是“在[我的网站名称]上重置密码”,我当然可以在管理后台更改网站名称,但有没有人知道怎么完全覆盖这个主题呢?
谢谢。
3 个回答
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
这个问题大约在8个月前就修复了,但这个改动似乎没有合并到1.3.1版本中。你可以查看这里:https://github.com/django/django/commits/master/django/contrib/auth/templates
开发版本
只需在你的模板目录下创建一个新文件 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])