自定义User模型后Django后台删用户触发RecursionError求助
解决Django自定义用户模型删除时的递归错误
问题根源
从报错回溯可以明确,递归循环的触发点在main/models.py的__init__方法中:
self.__initial_first_name = self.first_name self.__initial_last_name = self.last_name
当Django执行删除操作需要从数据库加载用户对象时,会调用模型的from_db方法创建实例,而自定义__init__中直接访问模型字段(如self.first_name)会触发refresh_from_db,后者又会重新创建实例,最终导致无限递归。
解决方案
1. 移除或调整自定义__init__方法
如果你的UserAccount模型中添加了上述自定义__init__来记录字段初始值,直接移除该方法即可。若需要追踪字段变化,改用以下替代方案:
- 使用
pre_save信号在保存前记录初始值 - 在模型
save方法中对比字段变化
示例(信号实现):
from django.db.models.signals import pre_save from django.dispatch import receiver from .models import UserAccount @receiver(pre_save, sender=UserAccount) def track_user_changes(sender, instance, **kwargs): if instance.pk: original = sender.objects.get(pk=instance.pk) instance.__initial_first_name = original.first_name instance.__initial_last_name = original.last_name else: instance.__initial_first_name = instance.first_name instance.__initial_last_name = instance.last_name
2. 修正Admin配置的字段错误
你的UserAdminConfig中fieldsets包含about字段,但UserAccount模型未定义该字段,会导致管理界面报错,需移除该字段:
fieldsets = ( (None, {'fields': ('email', 'first_name','last_name')}), ('Permissions', {'fields': ('is_staff', 'is_active', 'is_verified')}), # 删除不存在的'about'字段配置 )
3. 验证修复效果
重启Django服务后,进入admin界面尝试删除用户,确认递归错误消失。
内容的提问来源于stack exchange,提问作者Enoch
相关产品推荐
相关产品推荐

