Django新用户提交个人信息表单报PersonalInfo matching query does not exist错误
问题成因
- PersonalInfo模型未定义关联用户的外键字段
你当前的PersonalInfo模型代码中没有声明和系统用户表关联的user字段,执行PersonalInfo.objects.get(user=user)查询时,数据库中根本没有对应的user_id匹配列,自然无法查询到任何记录,直接抛出不存在错误。即便你在保存时手动赋值profile.user = request.user,这个属性也不会被持久化到数据库,属于无效操作。 - 新用户不存在预先创建的PersonalInfo关联记录
就算你后续补全了user外键字段,新用户注册完成后默认不会自动生成对应的PersonalInfo记录,Django的get()方法要求查询结果必须严格匹配1条,找不到对应记录就会直接抛出DoesNotExist异常。你移除instance参数后,ModelForm默认走新建逻辑,所以每次提交都会生成一条新的PersonalInfo记录,无法实现更新已有记录的需求。
修复步骤
- 首先补全
PersonalInfo模型的外键定义,修改models.py:
from django.contrib.auth import get_user_model User = get_user_model() class Field(models.Model): id = models.AutoField(primary_key=True) slug = models.CharField(max_length=16, default='default') # 原代码此处漏写models前缀,补充完整 title = models.CharField(max_length=32) class PersonalInfo(models.Model): id = models.AutoField(primary_key=True) # 新增和用户一对一关联的外键,删除用户时同步删除关联的个人信息 user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="personal_info") isCompleted = models.BooleanField(default=False) interested_fields = models.ManyToManyField(Field, blank=True)
修改完成后执行python manage.py makemigrations和python manage.py migrate同步数据库结构。
- 调整视图查询逻辑,用
get_or_create()方法兼容新用户无记录的场景,修改views.py的post方法:
def post(self, request, *args, **kwargs): user = request.user # 存在则获取对应记录,不存在则自动创建绑定当前用户的新记录 personal_info, created = PersonalInfo.objects.get_or_create(user=user) if request.method == 'POST': form = InterestedFieldsForm(request.POST, instance=personal_info) if form.is_valid(): form.save() else: form = InterestedFieldsForm(instance=personal_info) return render(request, 'reg/done.html', context={'form': form})
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

