Django中重写Save方法实现新用户自动创建关联确认模型条目
修正方案
你的代码存在几个关键问题,直接按下面的方式修改即可:
- 不要重新定义User类:你写的
class User:会覆盖Django自带的User模型,直接导致原有用户系统功能失效,这是核心错误。 - 用Django信号实现自动创建关联实例:Django提供的
post_save信号,能在User实例保存完成后自动触发操作,这才是扩展用户模型的正确方式。 - 修正实例保存的语法错误:创建
UserWithConfirmation时要正确完成实例化与保存操作,用objects.create()可以一步到位。
修正后的完整代码:
from django.db import models from django.contrib.auth.models import User from django.db.models.signals import post_save from django.dispatch import receiver class UserWithConfirmation(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="user_with_confirmation") is_email_confirmed = models.BooleanField(default=False) def __str__(self): return self.user.username @receiver(post_save, sender=User) def create_user_with_confirmation(sender, instance, created, **kwargs): # 仅当新用户创建时生成关联实例,避免更新用户时重复操作 if created: UserWithConfirmation.objects.create(user=instance)
关键说明:
@receiver(post_save, sender=User):这个装饰器将函数绑定到User模型的保存完成信号上,User实例保存后会自动触发该函数。created参数:用来判断当前是新建用户还是更新用户,只在新建用户时创建关联的UserWithConfirmation实例。UserWithConfirmation.objects.create(user=instance):通过模型管理器直接创建并保存实例,比手动实例化再调用save()更简洁可靠。
修改后,每次新建用户并保存时,系统会自动生成对应的UserWithConfirmation实例,is_email_confirmed默认值为False,完全符合你的需求。
内容的提问来源于stack exchange,提问作者dominz2
相关产品推荐
相关产品推荐

