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

时间:2010-03-01 11:53:13

标签: django django-forms

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

author = Author.objects.get(pk=1)
BookFormSet = inlineformset_factory(Author, Book)
formset = BookFormSet(request.POST, instance=author)

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

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

3 个答案:

答案 0 :(得分:6)

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)

答案 1 :(得分:2)

基于Jeremy Lewis,如果你不想继承BaseInlineFormSet,你可以给你的BookFormSet一个空的queryset参数。

参见伪(未经测试)Django 1.6代码示例:

BookFormSet = inlineformset_factory(parent=Author, model=Book)
if request.method == "POST":
    formset = BookFormSet(request.POST, request.FILES, instance=author)
    if formset.is_valid():
        formset.save()
else:
    queryset = Book.objects.none() # does not allow to edit books
    formset = BookFormSet(instance=project, initial=initial, queryset=queryset)
return render(request, "add_book.html", { "formset": formset, })

答案 2 :(得分:0)

实际上答案是在documentation中给出的。只是不要给FormSet任何实例。来自doc:

>>> from django.forms.models import inlineformset_factory
>>> BookFormSet = inlineformset_factory(Author, Book)
>>> author = Author.objects.get(name=u'Mike Royko')
>>> formset = BookFormSet() # This will create an empty form with your model fields

然后您可以按如下方式创建视图:

if request.method == "POST":
    formset = BookFormSet(request.POST, request.FILES)
    if formset.is_valid():
        formset.save()
else:
    formset = BookFormSet()
return render_to_response("add_book.html", {
    "formset": formset,

希望它有所帮助。