2012-03-29 32 views
5

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?

Respuesta

6

ha excluido este book del AuthorForm, así que Django no le importa lo que el valor de cleaned_data['book_id'] es - que va simplemente lo ignoran.

lugar, es necesario establecer la propiedad libro directamente en la instancia de autor no guardado:

book = book_form.save() 
    author = author.form.save(commit=False) 
    author.book = book 
    author.save() 
+0

ayudó, gracias. – Tadeck

3

usted podría intentar:

if author_form.is_valid() and book_form.is_valid(): 
    book = book_form.save() 
    author = author_form.save(commit=False) 
    author.book = book 
    author.save() 
Cuestiones relacionadas