在Django中保存嵌套表格

问题描述:

我有一个奇怪的问题。我试图验证通过POST请求发送的一个表单,而这个表单实际上是建立在四个模型的基础上的。在Django中保存嵌套表格

这个想法是验证所有表单,然后按照适当的顺序相应地保存它们,根据最近保存的模型实例分配外键。

当我尝试将值分配给通过form.is_valid()调用正确验证的模型的外键时,会出现问题。它抛出一个IntegrityError,说这个特定的外键“可能不是NULL”。

下面请找出应该给你的想法的代码我在做什么:

模型&形式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是一个整数(int,我已经检查过),最近保存的Book记录的ID。

你有什么想法我怎么能设置外键已验证&未保存的表单,所以我可以安全地将其保存到数据库中?

您已经排除AuthorFormbook,所以Django不关心的cleaned_data['book_id']值是 - 它会忽略它。

相反,你需要的书财产直接在未保存的作者实例设置:

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

它帮助,谢谢。 – Tadeck 2012-03-29 13:59:24

你可以尝试:

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