#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 django-updates+unsubscr...@googlegroups.com.
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