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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:54:55