Django:保存inlineformset_factory抛出(1048,“列'XX_id'不能为空”)

时间:2014-07-28 13:05:50

标签: django django-forms

我正在尝试保存一个inlineformset_factory表单,如果我正在编辑一个已存在的对象,则没有问题。如果这是我第一次创建对象,我有一个1048," Column' parte_id'不能为空")错误。

我的 models.py

class Parte(models.Model):
    cliente = models.ForeignKey(Cliente)
    averia = models.CharField(max_length=100)
    finalizada = models.BooleanField('Finalizado', default=False)
    firmada = models.BooleanField('Autorizado', default=False)

class Material(models.Model):
    parte = models.ForeignKey(Parte)
    nombre = models.CharField(max_length=20)
    cantidad = models.IntegerField(max_length=3)

class Prestacion(models.Model):
    parte = models.ForeignKey(Parte)
    equipo = models.CharField(max_length=100, blank=True)
    tiempo = models.DecimalField(max_digits=3, decimal_places=1)

class Observacion(models.Model):
    parte = models.OneToOneField(Parte)
    notas = models.TextField(max_length=750,null=True, blank=True)

我的 forms.py

MaterialFormSet = inlineformset_factory(Parte,Material,extra=3)
PrestacionFormSet = inlineformset_factory(Parte,Prestacion,extra=1)

class ObservacionForm(forms.ModelForm):
    class Meta:
        model = Observacion
        exclude = ('parte',)

class ParteForm(forms.ModelForm):
    class Meta:
        model = Parte

和我的 views.py

@login_required()
def editar_parte(request, parte_id=None):
    parte = None
    observacion = None
    # Comprobamos si el parte se puede guardar o no
    permitido = True
    if parte_id:
        parte = Parte.objects.get(pk=parte_id)  # probar get_or_404
        try:
            observacion = Observacion.objects.get(parte=parte_id)
        except:
            pass  # observacion = None
        if parte.procesado or parte.enviado:
            permitido = False
    formParte = ParteForm(instance=parte)
    formPrestacion = PrestacionFormSet(instance=parte)
    formMaterial = MaterialFormSet(instance=parte)
    formObservacion = ObservacionForm(instance=observacion)

    if request.method == 'POST':
        formParte = ParteForm(request.POST, instance=parte)
        formPrestacion = PrestacionFormSet(request.POST, instance=parte)
        formMaterial = MaterialFormSet(request.POST, instance=parte)
        formObservacion = ObservacionForm(request.POST, instance=observacion)
        if formParte.is_valid() and formPrestacion.is_valid() and formMaterial.is_valid() and formObservacion.is_valid():
            # Preguardamos el parte (nos genera una pk)
            parte = formParte.save(commit=False)
            parte.save()
            formPrestacion.save() #HERE IS THE PROBLEM
            formMaterial.save()
            if observacion:
                observacion.parte_id = parte.pk
                observacion.save()
            if request.POST.get('enviar')=='True':
                success ="enviado" # Enviamos el parte
            return redirect('gestion.views.listados.list_partes')
        else:
            error.append("Corregir los siguientes errores:")
    context = {'formParte': formParte, 'formPrestacion': formPrestacion, 'formMaterial': formMaterial, 'formObservacion': formObservacion,}

    return render(request, 'partes/editar.html', context)

似乎当我保存inlineformset_factory时,对象有自己的ForeignKey为空。

我试图更改formPrestacion.save()

                if formPrestacion.has_changed():
                for data in formPrestacion:
                    prest = data.save(commit=False)
                    prest.parte_id = parte.pk
                    prest.save()

但是当我删除对象时我遇到了问题,我不认为这是解决方案。

1 个答案:

答案 0 :(得分:0)

我认为我发现了这个错误。我改变了这个:

 if request.method == 'POST':
        formParte = ParteForm(request.POST, instance=parte)
        formPrestacion = PrestacionFormSet(request.POST, instance=parte)
        formMaterial = MaterialFormSet(request.POST, instance=parte)
        formObservacion = ObservacionForm(request.POST, instance=observacion)
        if formParte.is_valid() and formPrestacion.is_valid() and formMaterial.is_valid() and formObservacion.is_valid():

由此:

 if request.method == 'POST':
        formParte = ParteForm(request.POST, instance=parte)
        formObservacion = ObservacionForm(request.POST, instance=observacion)
        if formParte.is_valid():
            parte = formParte.save(commit=False)
            formPrestacion = PrestacionFormSet(request.POST, instance=parte)
            formMaterial = MaterialFormSet(request.POST, instance=parte)
            if formPrestacion.is_valid() and formMaterial.is_valid() and formObservacion.is_valid():