【问题标题】:How can I send an email to user on new user addition to django admin site?如何在新用户添加到 django 管理站点时向用户发送电子邮件?
【发布时间】:2011-07-06 08:10:44
【问题描述】:

每当管理员将新用户添加到管理站点时,我想向用户电子邮件地址发送一封包含登录详细信息的电子邮件。

我知道 Django 为此提供了 send_mail 模块,但我不知道我应该把这段代码放在哪里 并覆盖某些视图以在添加新用户时发送自动邮件。

from django.core.mail import send_mail

send_mail('Subject here', 'Here is the message.', 'from@example.com',
    ['to@example.com'], fail_silently=False)

我该怎么做?

我尝试将此代码放入我的 models.py

from django.db.models.signals import post_save
from django.contrib.auth.models import User

    def email_new_user(sender, **kwargs):
        if kwargs["created"]:  # only for new users
            new_user = kwargs["instance"] 
            print new_user.email
            #send_mail('Subject here', 'Here is the message.', 'from@example.com',['to@example.com'], fail_silently=False)


post_save.connect(email_new_user, sender=User)

但它没有在命令行上打印任何内容。我认为每当我创建新用户时都不会调用该函数。不知道为什么?

【问题讨论】:

标签: django django-admin


【解决方案1】:

我可以在上面的代码中看到多个问题。

  • 首先,def email_new_user() 缩进错误。如果这不是格式错误,请更正它。
  • new_user = kwargs.["instance"] 语法错误。真的应该是kwargs["instance"]

然后,您是否正在运行 SMTP 服务器?你可以从 shell 发送电子邮件吗?如果没有,请对其进行配置,然后重试。它应该可以工作。

【讨论】:

  • 感谢 Lakshman,缩进错误。现在该函数被调用,但是在用户创建的第一步而不是在第二步中包含用户电子邮件字段的任何方式,因为 django 在第一步创建对象,到那时我没有用户电子邮件 ID发送邮件。
  • 这实际上是一个不同的问题。您应该在同一页面中同时包含 UserForm 和 ProfileForm 并保存它们,前提是这两个表单都有效。
【解决方案2】:

你想hook the post_save signalUser 模型。

【讨论】:

  • 你能帮我看看可能是什么问题吗?
【解决方案3】:

一个可能的问题是,Django 用户创建包含两个步骤。首先 django 要求输入 usernamepasswordpassword Confirmation,当您按下保存(或保存并继续编辑)时,您的保存方法会在没有 电子邮件信息。由于 django 会将该请求作为新创建的记录接受,因此您的信号将为没有电子邮件信息的记录触发...

如果 django 以不同的方式处理管理保存并且不将新创建的记录实例标记为 created 您应该没有任何问题,但可能 django 不会这样做。

更新:一些可能的原因是:

  • 您需要 django 1.3,因此请使用 python manage.py version 检查您的 django 版本,并在需要时更新它...
  • models.py 文件的最佳位置

您可以将信号处理和注册代码放在您喜欢的任何位置。但是,您需要确保尽早导入它所在的模块,以便在需要发送任何信号之前注册信号处理。这使您的应用的 models.py 成为注册信号处理程序的好地方。

这些都是基本问题...

【讨论】:

  • 我什至尝试打印“测试”而不是打印 new_user.email,但它也没有打印。可能是什么问题?
  • 我运行的 Django 版本是 1.3,信号代码在 models.py 文件中.....谢谢回复,但还是不行
  • 您是否检查过将断言(或其他内容)放在接收器函数的第一行以检查您是否有关于 if 控件的问题?
  • 是的,当新用户添加到数据库时似乎没有调用,我仍然遇到这个问题:(
  • 我遇到了与 user_logged_in 信号类似的问题。将 django 更新到最新的存储库版本解决了这个问题。因此,如果您从 cvs 存储库安装 django,请更新您的 django。
猜你喜欢
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 2023-04-02
相关资源
最近更新 更多