将Django的inlineformset_factory限制为仅创建新对象

Ala*_*air 9 django django-forms

我正在使用django的内联formset工厂.要使用文档中的示例,

author = Author.objects.get(pk=1)
BookFormSet = inlineformset_factory(Author, Book)
formset = BookFormSet(request.POST, instance=author)
Run Code Online (Sandbox Code Playgroud)

将创建一个内联formset来编辑特定作者的书籍.

我想创建一个只允许用户添加该作者的新书而不是编辑现有书籍的表单集.有没有一种简单的方法来使用inlineformset_factory来做到这一点?

Jer*_*wis 7

inlineformset_factory采用formset kwarg,默认为BaseInlineFormSet.BaseInlineFormSet子类BaseModelFormSet,它定义了get_queryset方法.如果您创建一个BaseInlineFormSet子类并覆盖get_queryset以返回EmptyQuerySet(),那么您应该得到您所追求的内容.在上面的例子中,它看起来像这样:

from django.db.models.query import EmptyQuerySet
from django.forms.models import BaseInlineFormSet

class BaseInlineAddOnlyFormSet(BaseInlineFormSet):
    def get_queryset(self):
        return EmptyQuerySet()

author = Author.objects.get(pk=1)
BookFormSet = inlineformset_factory(Author, Book, formset=BaseInlineAddOnlyFormSet)
formset = BookFormSet(request.POST, instance=author)
Run Code Online (Sandbox Code Playgroud)