You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:21:03