2012-03-29 59 views
5

私は奇妙な問題があります。 POSTリクエストを通じて送信された1つのフォームを検証しようとしていますが、このフォームは実際には4つのモデルの基礎に基づいて構築されています。Djangoで入れ子になったフォームを保存する

考えられるのは、すべてのフォームを検証し、適切に保存されたフォームを、最近保存したモデルインスタンスに基づいて外部キーを割り当てることです。

form.is_valid()呼び出しによって正しく検証されたモデルの外部キーに値を割り当てるときに問題が発生します。しかし、この特定の外部キー "はNULLでない可能性があります"を示すIntegrityErrorがスローされます。

以下

私がやっているものにあなたのアイデアを与える必要があるコードを見つけてください。

モデル&フォーム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 

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! 

author_form.save()の間に私はこのようなエラーを受け取ります:

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

book.idは、最近保存されたIDであるBookのIDを持つ整数(int、私はそれをチェックしました)と完全に一致しています。

有効である&の未保存の形式を持つ外部キーをどのように設定することができますか?私は安全にデータベースに保存できますか?

答えて

6

、Djangoはcleaned_data['book_id']の値が何であるかを気にしないように - それはちょうどそれを無視します。

代わりに、保存されていない著者のインスタンス上で直接ブックプロパティを設定する必要があります。

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

それは、感謝を助けました。 – Tadeck

3

あなたが試みることができる:あなたがAuthorFormからbookを除外しました

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() 
関連する問題