当有新用户添加到Django管理员站点时,我该如何向用户发送电子邮件?

3

每当管理员在管理站点上添加新用户时,我希望能够向用户的电子邮件地址发送带有登录详细信息的电子邮件。

我知道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)

但是在命令行上没有任何输出。我认为每当我创建一个新用户时该函数不会被调用,不知道为什么?


1
这个问题昨天刚被问到 https://dev59.com/AFjUa4cB1Zd3GeqPVuzY - Shawn Chin
3个回答

3
我能看到上面的代码有多个问题。
  • 首先,def email_new_user() 的缩进不正确。如果这不是格式错误,请进行更正。
  • new_user = kwargs.["instance"] 是错误的语法。正确的写法应该是 kwargs["instance"]

然后,你是否有一个正在运行的SMTP服务器?您能否从shell发送电子邮件?如果不能,请配置并再次尝试。它应该可以工作。


谢谢Lakshman,缩进有误。现在函数被调用了,但是有没有办法在用户创建的第一步中包含用户电子邮件字段,而不是在第二步中,因为Django在第一步中创建对象,而那时我还没有用户电子邮件ID来发送邮件。 - Anshul
这实际上是一个不同的问题。您应该在同一页中包含UserForm和ProfileForm,并且仅当两个表单都验证通过时才保存它们。 - lprsd

1

你能帮我说一下可能出了什么问题吗? - Anshul

0

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

如果Django以不同的方式处理管理员保存并且不将新创建的记录实例标记为已创建,则您将不会遇到任何问题,但是可能Django不会这样做。

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

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

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

这些都是基本问题...


我甚至尝试使用打印“testing”而不是打印new_user.email,但它也没有打印出来。可能是什么问题? - Anshul
我正在运行的Django版本是1.3,并且信号代码位于models.py文件中.....谢谢回复,但它仍然没有起作用。 - Anshul
你尝试在接收函数的第一行加入一个断言(或其他内容)来检查是否存在关于控制语句的问题了吗? - FallenAngel
是的,当新用户添加到数据库时,似乎没有调用,我仍然被这个问题困扰 :( - Anshul
我曾经遇到过与 user_logged_in 信号类似的问题。将 Django 更新到最新的存储库版本后,问题得以解决。因此,如果您从 CVS 存储库安装 Django,请更新您的 Django。 - FallenAngel

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