Django创建用户时如何让SendMail信号等待填充邮箱姓名后触发
解决方案
方案1:修改Django Admin用户创建表单,一步完成信息填写(推荐)
直接从源头解决两步保存的问题,不需要修改原有信号逻辑,后续管理操作也更便捷。
在你的admin.py文件中添加以下代码:
from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.models import User from .models import Profile class UserAdmin(BaseUserAdmin): # 新增用户时直接展示邮箱、姓名等必填字段 add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('username', 'password1', 'password2', 'email', 'first_name', 'last_name'), }), ) # 注销默认的User注册规则,替换为自定义规则 admin.site.unregister(User) admin.site.register(User, UserAdmin) # 注册Profile模型(如果之前没有注册可以加上) admin.site.register(Profile)
修改完成后,后台创建用户的页面会直接显示邮箱、姓名输入框,第一次保存时所有字段就会同步存入User表,原有发信信号不需要调整就可以拿到完整字段。
方案2:修改信号逻辑,等待字段填充完成后再发信
如果不想调整Admin默认操作流程,可以给Profile增加发信状态标记,只有必填字段填充完成、且未发过邮件时才触发发送动作。
首先修改models.py中的Profile模型,新增发信状态字段:
class Profile(models.Model): def __str__(self): return str(self.user) user = models.OneToOneField(User, null=True, on_delete=models.CASCADE) date = models.DateField(auto_now_add=True, auto_now=False, blank=True) # 新增发信状态标记,默认未发送 is_mail_sent = models.BooleanField(default=False, verbose_name="欢迎邮件已发送") ...
再修改发信信号逻辑:
@receiver(post_save, sender=User) def send_new_user_data_email(sender, instance, created, **kwargs): # 仅当邮箱、姓名已填充,且未发送过邮件时才触发 if instance.email and instance.first_name and not instance.profile.is_mail_sent: username = instance.username full_name = f"{instance.first_name}{instance.last_name}" user_email = instance.email subject = 'Subject line' message = '用户: {0}\n姓名: {1}\n邮箱: {2}\n密码: ... \nblablabla'.format(username, full_name, user_email) send_mail( subject, message, 'example@example.com', ['recipeint1@xample.com', 'recipent2@xample.com ', user_email], fail_silently=False, ) # 标记为已发送,避免重复触发 instance.profile.is_mail_sent = True instance.profile.save()
内容的提问来源于stack exchange,提问作者RlM
相关产品推荐
相关产品推荐

