Ev.
Ev.

Reputation: 1567

How to instantiate FormSet with objects

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)

Forms.py

class OfferItemForm(ModelForm):

class Meta:
    model = OfferItem
    exclude = ('offer', 'item_code', 'type')
    [...]

Views.py

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?

Edit: Using modelformset_factory()

OfferItemFormSet = modelformset_factory(OfferItem, form=OfferItemForm, formset=RequiredFormSet)

Forms.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

Views.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

Resolution

After changing BaseFormSet to BaseModelFormSet AND adding {{ form.id }} to my loop when generating the formset in the template.

Upvotes: 1

Views: 1812

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599490

You need to use a ModelFormset, and modelformset_factory, if you want to work with model objects.

Upvotes: 5

Related Questions