Reputation: 1567
I tried looking in Django Docs to see if I could find a similar parameter to instance in ModelForm but I could not make it work.
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)
class OfferItemForm(ModelForm):
class Meta:
model = OfferItem
exclude = ('offer', 'item_code', 'type')
[...]
i = OfferItem.objects.filter(offer=o).values()
item_formset = OfferItemFormSet(queryset=i)
I always __init__() got an unexpected keyword argument 'queryset'
. I tried to change from formset_factory to modelformset_factory but still the same problem.
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'
Why is it such a big deal? Why isn't there an instance= parameter on the constructor method of the formset just like a ModelForm has?
OfferItemFormSet = modelformset_factory(OfferItem, form=OfferItemForm, formset=RequiredFormSet)
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
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
After changing BaseFormSet
to BaseModelFormSet
AND adding {{ form.id }}
to my loop when generating the formset in the template.
Upvotes: 1
Views: 1812
Reputation: 599490
You need to use a ModelFormset, and modelformset_factory
, if you want to work with model objects.
Upvotes: 5