Django:保存constancia_pro表数据时修改lpro_reg表status字段失败
问题
尝试在constancia_pro表中保存数据的同时,将lpro_reg表的status字段从NO修改为SI,但触发错误:
The lpro_reg could not be changed because the data didn't validate.
相关代码
models.py
class lpro_reg(models.Model): id = models.AutoField(primary_key=True) tipodoc = ( ('V', 'V'), ('E', 'E'), ('J', 'J'), ('G', 'G'), ) tipo = models.CharField(max_length=2, choices=tipodoc, default='J') documento= models.CharField(max_length=15, blank=False) nombre = models.CharField(max_length=150, blank=False) presentante = models.CharField(max_length=150, blank=False) fecha_reg= models.DateField(auto_now_add=True) ramos = models.ManyToManyField(ciuu) direccion = models.CharField(max_length=250, blank=False) n_recibo = models.CharField(max_length=50, blank=True) fecha_recibo = models.DateField() fecha_apert = models.DateField() opciones = ( ('SI', 'SI'), ('NO', 'NO'), ) status = models.CharField(max_length=2, choices=opciones, default='NO') responsable = models.ForeignKey(User, on_delete=models.CASCADE) class Meta: db_table = 'prov_reg' ordering = ['id'] def __str__(self): return str(self.id) class constancia_pro(models.Model): licencia2 = models.AutoField(primary_key=True) n_constanica = models.CharField(unique=True, max_length=13) aprobado = models.OneToOneField(lpro_reg, on_delete=models.CASCADE) fecha_reg = models.DateField(auto_now_add=True) class Meta: db_table = 'pro_const' ordering = ['-licencia2'] def __str__(self): return str(self.licencia2)
views.py
verdatos = get_object_or_404(lpro_reg.objects, pk = id) ultimodato = constancia_pro.objects.first() ultima_id = int(ultimodato.n_constanica) if request.method == 'POST': formulario = aprobado_form(request.POST) formulario2 = registroprovicional_form(request.POST, request.FILES, instance=verdatos) if formulario.is_valid(): formulario.instance.n_constanica = ultima_id + 1 formulario.instance.aprobado = lpro_reg.objects.filter(pk = id).first() formulario2.instance.status = 'SI' formulario2.save() formulario.save() messages.success(request, 'Se ha guardado correctamente') return redirect('/actividad_economica/') return render(request, 'act_econ/aprobacion.html', {'info':verdatos})
错误原因
你通过registroprovicional_form修改lpro_reg实例时,传入了request.POST数据,但该表单对应的lpro_reg模型包含多个必填字段(如documento、nombre、direccion等),而POST请求中并未携带这些字段的值,导致表单验证失败,无法保存修改。
解决方法
方法1:直接操作实例(推荐)
无需通过表单修改status字段,直接修改已获取的verdatos实例并保存:
verdatos = get_object_or_404(lpro_reg.objects, pk = id) ultimodato = constancia_pro.objects.first() ultima_id = int(ultimodato.n_constanica) if request.method == 'POST': formulario = aprobado_form(request.POST) if formulario.is_valid(): formulario.instance.n_constanica = ultima_id + 1 formulario.instance.aprobado = verdatos # 直接使用已获取的实例,无需重复查询 # 直接修改status并保存 verdatos.status = 'SI' verdatos.save() formulario.save() messages.success(request, 'Se ha guardado correctamente') return redirect('/actividad_economica/') return render(request, 'act_econ/aprobacion.html', {'info':verdatos})
方法2:调整表单验证逻辑
如果必须使用表单,可修改registroprovicional_form,仅包含需要修改的status字段:
# 表单定义示例 class registroprovicional_form(forms.ModelForm): class Meta: model = lpro_reg fields = ['status'] # 只保留需要修改的字段
或者在视图中不传递request.POST,直接初始化表单并修改字段:
# 替换原formulario2相关代码 formulario2 = registroprovicional_form(instance=verdatos) formulario2.instance.status = 'SI' formulario2.save()
内容的提问来源于stack exchange,提问作者Ronald Gimenez
相关产品推荐
相关产品推荐

