代码之家  ›  专栏  ›  技术社区  ›  Alasdair

将Django的inlineformset工厂限制为仅创建新对象

  •  8
  • Alasdair  · 技术社区  · 16 年前

    我正在使用django的内联表单集工厂。要在文档中使用该示例,

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

    将创建内联表单集以编辑特定作者的书籍。

    我想创建一个只允许用户 添加

    3 回复  |  直到 10 年前
        1
  •  7
  •   Jeremy Lewis    15 年前

    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)
    
        2
  •  2
  •   Andre Miras    12 年前

    基于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, })
    
        3
  •  0
  •   user268157 user268157    15 年前

    实际上答案在 documentation

    >>> 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,
    

    希望有帮助。