我正在尝试保存一个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()
但是当我删除对象时我遇到了问题,我不认为这是解决方案。
答案 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():