Tengo un problema extraño. Estoy tratando de validar un formulario enviado a través de la solicitud POST, y este formulario se basa en cuatro modelos.Guardando formularios anidados en Django
La idea es validar todos los formularios y luego guardarlos en consecuencia, en el orden apropiado, asignando claves externas en función de las instancias del modelo recientemente guardadas.
El problema se produce cuando intento asignar un valor a la clave externa del modelo que se ha validado correctamente a través de la llamada form.is_valid()
. Sin embargo arroja un IntegrityError
diciendo que esta clave externa específica "puede no ser NULA".
A continuación encontrará el código que debe darle la idea de lo que estoy haciendo:
Modelos & formas defitinions:
class Author(models.Model):
name = models.CharField(blank=False, max_length=150)
book = models.OneToOneField('Book') # its important, one author has one book
class Book(models.Model):
name = models.CharField(blank=False, max_length=150)
class AuthorForm(ModelForm):
class Meta:
model = Author
exclude = ('book',)
class BookForm(ModelForm):
class Meta:
model = Book
En una de las vistas:
if request.method == "POST":
author_form = AuthorForm(request.POST, prefix='author')
book_form = BookForm(request.POST, prefix='book')
if author_form.is_valid() and book_form.is_valid():
book = book_form.save()
author_form.cleaned_data['book_id'] = book.id
author.form.save() # Error!
Durante author_form.save()
obtengo un error similar a esto:
IntegrityError at /api/my_method
myapp_author.book_id may not be NULL
Estoy completamente seguro de que book.id
es un número entero (int
, lo he comprobado) con el ID del registro Book
recientemente guardado.
¿Tiene alguna idea de cómo puedo configurar la clave externa que ha validado & sin guardar, así que puedo guardarla de forma segura en la base de datos?
ayudó, gracias. – Tadeck