2012-03-29 21 views
5

Ho uno strano problema. Sto provando a convalidare un modulo inviato tramite la richiesta POST, e questo modulo è in realtà costruito sulla base di quattro modelli.Salvataggio di moduli nidificati in Django

L'idea è di convalidare tutti i moduli e quindi salvarli di conseguenza, nell'ordine appropriato, assegnando chiavi esterne sulla base delle istanze del modello salvate di recente.

Il problema si verifica quando si tenta di assegnare un valore alla chiave esterna del modello correttamente convalidato tramite la chiamata form.is_valid(). Getta comunque un IntegrityError dicendo che questa chiave estranea specifica "potrebbe non essere NULL".

Qui di seguito potete trovare il codice che dovrebbe dare l'idea su quello che sto facendo:

modelle & forme 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 

In una delle viste:

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 lo author_form.save() ho ricevuto un errore simile a questo:

IntegrityError at /api/my_method 
myapp_author.book_id may not be NULL 

Sono assolutamente sicuro che book.id sia un numero intero (int, l'ho verificato) con l'ID del record Book salvato di recente.

Avete idea di come potrei impostare la chiave esterna che ha convalidato il modulo non salvato &, quindi posso salvarlo tranquillamente nel database?

risposta

6

hai escluso book dalla AuthorForm, in modo da Django non importa quale sia il valore di cleaned_data['book_id'] è - sarà solo ignorarlo.

Invece, è necessario impostare la proprietà prenotare direttamente sull'istanza autore non salvati:

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

Mi ha aiutato, grazie. – Tadeck

3

si potrebbe provare:

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() 
Problemi correlati