2012-03-29 20 views
5

Mam dziwny problem. Próbuję zweryfikować jeden formularz wysłany za pośrednictwem żądania POST, a ta forma jest w rzeczywistości zbudowany na podstawie czterech modeli.Zapisywanie zagnieżdżonych formularzy w Django

Chodzi o to, aby sprawdzić wszystkie formularze, a następnie zapisać je odpowiednio, w odpowiedniej kolejności, przypisując klucze obce na podstawie ostatnio zapisanych wystąpień modelu.

Problem występuje, gdy próbuję przypisać wartość do klucza obcego modelu, który został poprawnie sprawdzony za pomocą wywołania form.is_valid(). Podaje jednak IntegrityError, mówiąc, że ten konkretny klucz obcy "nie może być NULL".

Poniżej znaleźć kod, który powinien dać ci pomysł na to, co robię:

modele & formy 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 

W jednym z widoków:

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! 

Podczas author_form.save() pojawia się błąd podobny do tego:

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

Jestem całkowicie pewien, że book.id jest liczbą całkowitą (int, sprawdziłem to) z identyfikatorem ostatnio zapisanego rekordu Book.

Czy masz pojęcie, w jaki sposób ustawić klucz objaśniony o niezapisanym formularzu &, aby bezpiecznie zapisać go w bazie danych?

Odpowiedz

6

pan wykluczony book z AuthorForm, więc Django nie obchodzi, co wartość cleaned_data['book_id'] jest - będzie to po prostu zignorować.

Zamiast tego, należy ustawić właściwość książki bezpośrednio na niezapisanych przykład autor:

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

To pomogło, dzięki. – Tadeck

3

można spróbować:

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() 
Powiązane problemy