Tad*_*eck 5 django validation django-models django-forms
我有一个奇怪的问题.我正在尝试验证通过POST请求发送的一个表单,而这个表单实际上是建立在四个模型的基础上的.
我们的想法是验证所有表单,然后以适当的顺序相应地保存它们,根据最近保存的模型实例分配外键.
当我尝试将值分配给通过form.is_valid()调用正确验证的模型的外键时,会发生此问题.然而,它抛出一个IntegrityError说法,这个特定的外键" 可能不是NULL ".
请在下面找到能够让您了解我在做什么的代码:
模型和表格缺陷:
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
Run Code Online (Sandbox Code Playgroud)
在其中一个观点中:
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!
Run Code Online (Sandbox Code Playgroud)
在author_form.save()我得到类似这样的错误:
IntegrityError at /api/my_method
myapp_author.book_id may not be NULL
Run Code Online (Sandbox Code Playgroud)
我完全确定这book.id是一个整数(int我已经检查过),带有最近保存的Book记录的ID .
您是否知道如何设置具有已验证和未保存表单的外键,以便我可以安全地将其保存到数据库中?
你已经排除book了AuthorForm,所以Django不在乎cleaned_data['book_id']它的价值是什么- 它只会忽略它.
相反,您需要直接在未保存的作者实例上设置book属性:
book = book_form.save()
author = author.form.save(commit=False)
author.book = book
author.save()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1642 次 |
| 最近记录: |