【问题标题】:Django password reset email subjectDjango 密码重置邮件主题
【发布时间】:2011-12-10 13:11:10
【问题描述】:

我已经成功地为 Django 中的密码重置页面添加了我自己的自定义 HTML 模板,并且一切正常。唯一我不知道如何包含我自己的电子邮件主题。

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

谢谢。

【问题讨论】:

    标签: python django


    【解决方案1】:

    开发版

    只需在模板目录中创建新文件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/ 目录中,但它仍使用默认主题。
    • 抱歉给您带来不便,我有点错了。路径取决于 TEMPLATE_DIRS 设置。如果模板将被放置在 //auth/registration/ 应该可以工作
    • 感谢 Alexey,但我仍然无法完成这项工作。这适用于 Django 1.3.0 吗?因为我只是查看了 contrib 目录中的 forms.py 并且没有提到 password_reset_subject.txt - PasswordResetForm 类的 save() 方法没有指定 password_reset_subject.txt - 主题是硬编码的。有什么想法可以覆盖它吗?
    • 我刚刚更新了答案。此代码未经测试,但希望您能理解
    • 我收到以下错误:异常值:'CustomPasswordResetForm' 对象没有属性'users_cache'
    【解决方案2】:

    大约 8 个月前已修复此问题,但更改似乎并未合并到 1.3.1 中。看: https://github.com/django/django/commits/master/django/contrib/auth/templates

    【讨论】:

      【解决方案3】:

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

      使用 admin 或 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 值,但主题仍然会说“密码重置...” - 我想知道如何将整个主题更改为“更改密码”。跨度>
      猜你喜欢
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 2016-08-07
      • 2012-01-26
      • 1970-01-01
      • 2017-01-25
      • 2020-02-15
      • 1970-01-01
      相关资源
      最近更新 更多