每当管理员向管理网站添加新用户时,我都希望向用户发送一封包含登录详细信息的电子邮件。
我知道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)
但它不能在命令行上打印任何东西。我认为每当我创建一个新用户时都不会调用该函数。不知道为什么?
答案 0 :(得分:3)
我可以在代码中看到多个问题,我可以在上面看到它。
def email_new_user()
被错误地缩进。如果这不是格式化错误,请更正它。new_user = kwargs.["instance"]
语法错误。它应该是kwargs["instance"]
然后,你有运行的SMTP服务器吗?你能从shell发送电子邮件吗?如果没有,请配置,然后再次尝试。它应该工作。
答案 1 :(得分:1)
您希望User
型号为hook the post_save
signal。
答案 2 :(得分:0)
一个可能的问题是,Django用户创建包含两个步骤。首先django要求用户名,密码和密码确认,当您按保存(或保存并继续编辑)时,您的保存方法无需< strong>电子邮件信息。由于django将接受该请求作为新创建的记录,您的信号将触发一条没有电子邮件信息的记录......
如果django处理admin保存并且不将新创建的记录实例标记为 created ,则不会有任何问题,但django可能不会这样做。
更新:一些可能的原因是:
您可以将信号处理和注册码放在任何您喜欢的地方。但是,您需要确保早期导入模块,以便在需要发送任何信号之前注册信号处理。这使得你的应用程序的models.py成为一个放置信号处理程序注册的好地方。
这些是基本问题......