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?
To pomogło, dzięki. – Tadeck