如何使用对象实例化 FormSet

Ev.*_*Ev. 1 python django

我尝试在Django Docs中查找是否可以找到与 ModelForm 中的实例类似的参数,但无法使其工作。

class RequiredFormSet(BaseFormSet):
    def __init__(self, *args, **kwargs):
        super(RequiredFormSet, self).__init__(*args, **kwargs)
        for form in self.forms:
            form.empty_permitted = False

OfferItemFormSet = formset_factory(OfferItemForm, formset=RequiredFormSet)
Run Code Online (Sandbox Code Playgroud)

表格.py

class OfferItemForm(ModelForm):

class Meta:
    model = OfferItem
    exclude = ('offer', 'item_code', 'type')
    [...]
Run Code Online (Sandbox Code Playgroud)

视图.py

i = OfferItem.objects.filter(offer=o).values()
item_formset = OfferItemFormSet(queryset=i)
Run Code Online (Sandbox Code Playgroud)

我总是__init__() got an unexpected keyword argument 'queryset'。我尝试从 formset_factory 更改为 modelformset_factory 但仍然存在同样的问题。

Traceback:
File "/Library/Python/2.7/site-packages/Django-1.8.3-py2.7.egg/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Library/Python/2.7/site-packages/Django-1.8.3-py2.7.egg/django/contrib/auth/decorators.py" in _wrapped_view
  22.                 return view_func(request, *args, **kwargs)
File "[...]/filter_decorators.py" in _wrapped_view
  13.                 return a_view(request, *args, **kwargs)
File "[...]/views.py" in manage_offer
  1330.         item_formset = OfferItemFormSet(queryset=i)
File "[...]/forms.py" in __init__
  197.             super(RequiredFormSet, self).__init__(*args, **kwargs)

Exception Type: TypeError at /my/offer/add/
Exception Value: __init__() got an unexpected keyword argument 'queryset'
Run Code Online (Sandbox Code Playgroud)

为什么这么重要?为什么表单集的构造函数方法上不像 ModelForm 那样有一个 instance= 参数?

编辑:使用 modelformset_factory()

OfferItemFormSet = modelformset_factory(OfferItem, form=OfferItemForm, formset=RequiredFormSet)
Run Code Online (Sandbox Code Playgroud)

表格.py

from django.forms.models import modelformset_factory

class RequiredFormSet(BaseFormSet):
    def __init__(self, *args, **kwargs):
        super(RequiredFormSet, self).__init__(*args, **kwargs)
        for form in self.forms:
            form.empty_permitted = False
Run Code Online (Sandbox Code Playgroud)

视图.py

i = OfferItem.objects.filter(offer=o)
item_formset = OfferItemFormSet(queryset=i)

__init__() got an unexpected keyword argument 'query set'
Exception Location: [...]/forms.py in __init__, line 198
Run Code Online (Sandbox Code Playgroud)

解决

在模板中生成表单集时更改BaseFormSet为BaseModelFormSetAND 添加到我的循环后。{{ form.id }}

Dan*_*man 5

如果您想使用模型对象,则需要使用 ModelFormset 和modelformset_factory。