我已经成功地为Django的密码重置页面添加了自定义的HTML模板,并且一切进展顺利。唯一无法解决的问题是如何包含我的电子邮件主题。
默认主题是“[我的站点名称]上的密码重置”,我可以在管理员中更改站点名称,但是否有人知道如何覆盖整个主题行?
谢谢。
开发版本
只需在您的模板目录中创建新文件registration/password_reset_subject.txt
。这将覆盖默认的Django主题。
和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"
# change to your custom view
(r'^password_reset/$', 'your_app.views.password_reset'),
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])
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
>>>
SITE_ID = 2