#35739: ModelFormset,  self.initial_extra issue
-------------------------------+--------------------------------------
     Reporter:  hcjohnston     |                    Owner:  (none)
         Type:  Bug            |                   Status:  new
    Component:  Forms          |                  Version:  5.0
     Severity:  Normal         |               Resolution:
     Keywords:  model formset  |             Triage Stage:  Unreviewed
    Has patch:  0              |      Needs documentation:  0
  Needs tests:  0              |  Patch needs improvement:  0
Easy pickings:  1              |                    UI/UX:  0
-------------------------------+--------------------------------------
Changes (by hcjohnston):

 * summary:  ModelForm self.initial_extra  - dict or list? => ModelFormset,
     self.initial_extra issue


Old description:

> using djagno 5.0
>
> I have an UpdateView which uses a ModelForm and two formsets
> ("item_formset" and "section_formset" below) to update a model. Both
> formsets have extra=0 and no initial data.
> I am getting an error when the item_formset.is_valid() is called. see
> traceback below. no issues with the ModelForm or section_formset
>
> {{{
> class SiteVisitItemForm(forms.ModelForm):
>
>     class Meta:
>         model = models.SiteVisitItem
>         exclude = "report", "project", "action_for", "action_complete",
> "number"
>
> SiteVisitItemFormSet = forms.models.inlineformset_factory(
>     models.SiteVisitReport, models.SiteVisitItem,
>     form=SiteVisitItemForm,
>     can_delete=True,
>     extra=0,
>     can_order=True,
> )
>
> class SiteVisitSectionForm(forms.Form):
>     section_name = forms.CharField(max_length=128, required=False,
> widget=forms.TextInput(attrs={"placeholder": "Section heading"}))
>     section_text = forms.CharField(max_length=1000, required=False,
> widget=forms.Textarea(attrs={"placeholder": "Introduction", "style":
> "height: 100px;"}))
>
> SiteVisitSectionFormset = forms.formset_factory(
>     form=SiteVisitSectionForm, can_delete=True, extra=0, can_order=True
> )
>
> }}}
>

> {{{
>
> Traceback (most recent call last):
>   File "python3.10/site-packages/django/core/handlers/exception.py", line
> 55, in inner
>     response = get_response(request)
>   File "python3.10/site-packages/django/core/handlers/base.py", line 197,
> in _get_response
>     response = wrapped_callback(request, *callback_args,
> **callback_kwargs)
>   File "python3.10/site-packages/django/views/generic/base.py", line 104,
> in view
>     return self.dispatch(request, *args, **kwargs)
>   File "python3.10/site-packages/fivestar_app/quality/views.py", line
> 129, in dispatch
>     return super().dispatch(request, *args, **kwargs)
>   File "python3.10/site-packages/django/contrib/auth/mixins.py", line
> 109, in dispatch
>     return super().dispatch(request, *args, **kwargs)
>   File "python3.10/site-packages/django/views/generic/base.py", line 143,
> in dispatch
>     return handler(request, *args, **kwargs)
>   File "python3.10/site-packages/fivestar_app/quality/views.py", line
> 222, in post
>     if all([form.is_valid(), item_formset.is_valid(),
> section_formset.is_valid()]):
>   File "python3.10/site-packages/django/forms/formsets.py", line 384, in
> is_valid
>     self.errors
>   File "python3.10/site-packages/django/forms/formsets.py", line 366, in
> errors
>     self.full_clean()
>   File python3.10/site-packages/django/forms/formsets.py", line 423, in
> full_clean
>     for i, form in enumerate(self.forms):
>   File "python3.10/site-packages/django/utils/functional.py", line 47, in
> __get__
>     res = instance.__dict__[self.name] = self.func(instance)
>   File "python3.10/site-packages/django/forms/formsets.py", line 205, in
> forms
>     return [
>   File "python3.10/site-packages/django/forms/formsets.py", line 206, in
> <listcomp>
>     self._construct_form(i, **self.get_form_kwargs(i))
>   File "python3.10/site-packages/django/forms/models.py", line 1120, in
> _construct_form
>     form = super()._construct_form(i, **kwargs)
>   File "python3.10/site-packages/django/forms/models.py", line 737, in
> _construct_form
>     kwargs["initial"] = self.initial_extra[i - self.initial_form_count()]
>
> Exception Type: KeyError at /quality/sitevisitreports/24022/2/items/
> Exception Value: 0
> }}}
>

>
> the traceback appears to refer to this part of model form:
>
> {{{
>
>         elif self.initial_extra:
>             # Set initial values for extra forms
>             try:
>                 kwargs["initial"] = self.initial_extra[i -
> self.initial_form_count()]
>             except IndexError:
>                 pass
> }}}
>
> given that self.initial_extra = initial and initial is a dictionary, is
> IndexError the right exception here?

New description:

 using djagno 5.0

 I have an UpdateView which uses a ModelForm and two formsets
 ("item_formset" and "section_formset" below) to update a model. Both
 formsets have extra=0 and no initial data.
 I am getting an error when the item_formset.is_valid() is called. see
 traceback below. no issues with the ModelForm or section_formset

 {{{
 class SiteVisitItemForm(forms.ModelForm):

     class Meta:
         model = models.SiteVisitItem
         exclude = "report", "project", "action_for", "action_complete",
 "number"

 SiteVisitItemFormSet = forms.models.inlineformset_factory(
     models.SiteVisitReport, models.SiteVisitItem,
     form=SiteVisitItemForm,
     can_delete=True,
     extra=0,
     can_order=True,
 )

 class SiteVisitSectionForm(forms.Form):
     section_name = forms.CharField(max_length=128, required=False,
 widget=forms.TextInput(attrs={"placeholder": "Section heading"}))
     section_text = forms.CharField(max_length=1000, required=False,
 widget=forms.Textarea(attrs={"placeholder": "Introduction", "style":
 "height: 100px;"}))

 SiteVisitSectionFormset = forms.formset_factory(
     form=SiteVisitSectionForm, can_delete=True, extra=0, can_order=True
 )

 }}}


 {{{

 Traceback (most recent call last):
   File "python3.10/site-packages/django/core/handlers/exception.py", line
 55, in inner
     response = get_response(request)
   File "python3.10/site-packages/django/core/handlers/base.py", line 197,
 in _get_response
     response = wrapped_callback(request, *callback_args,
 **callback_kwargs)
   File "python3.10/site-packages/django/views/generic/base.py", line 104,
 in view
     return self.dispatch(request, *args, **kwargs)
   File "python3.10/site-packages/fivestar_app/quality/views.py", line 129,
 in dispatch
     return super().dispatch(request, *args, **kwargs)
   File "python3.10/site-packages/django/contrib/auth/mixins.py", line 109,
 in dispatch
     return super().dispatch(request, *args, **kwargs)
   File "python3.10/site-packages/django/views/generic/base.py", line 143,
 in dispatch
     return handler(request, *args, **kwargs)
   File "python3.10/site-packages/fivestar_app/quality/views.py", line 222,
 in post
     if all([form.is_valid(), item_formset.is_valid(),
 section_formset.is_valid()]):
   File "python3.10/site-packages/django/forms/formsets.py", line 384, in
 is_valid
     self.errors
   File "python3.10/site-packages/django/forms/formsets.py", line 366, in
 errors
     self.full_clean()
   File python3.10/site-packages/django/forms/formsets.py", line 423, in
 full_clean
     for i, form in enumerate(self.forms):
   File "python3.10/site-packages/django/utils/functional.py", line 47, in
 __get__
     res = instance.__dict__[self.name] = self.func(instance)
   File "python3.10/site-packages/django/forms/formsets.py", line 205, in
 forms
     return [
   File "python3.10/site-packages/django/forms/formsets.py", line 206, in
 <listcomp>
     self._construct_form(i, **self.get_form_kwargs(i))
   File "python3.10/site-packages/django/forms/models.py", line 1120, in
 _construct_form
     form = super()._construct_form(i, **kwargs)
   File "python3.10/site-packages/django/forms/models.py", line 737, in
 _construct_form
     kwargs["initial"] = self.initial_extra[i - self.initial_form_count()]

 Exception Type: KeyError at /quality/sitevisitreports/24022/2/items/
 Exception Value: 0
 }}}



 the traceback appears to refer to this part of model form:

 {{{

         elif self.initial_extra:
             # Set initial values for extra forms
             try:
                 kwargs["initial"] = self.initial_extra[i -
 self.initial_form_count()]
             except IndexError:
                 pass
 }}}

 it appears that self.intial_extra may be a dictionary?

--
-- 
Ticket URL: <https://code.djangoproject.com/ticket/35739#comment:4>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070191c57dc840-8ebf1468-79c7-49f2-b729-925fc861b034-000000%40eu-central-1.amazonses.com.

Reply via email to