Opened 3 months ago
Last modified 3 months ago
#35739 closed Bug
formset error — at Initial Version
Reported by: | hcjohnston | Owned by: | |
---|---|---|---|
Component: | Forms | Version: | 5.0 |
Severity: | Normal | Keywords: | model formset |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | yes | UI/UX: | no |
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;"})) def clean(self): if self.cleaned_data["section_name"] == "" and self.cleaned_data["section_text"] == "" and self.cleaned_data["DELETE"] == False: self.add_error(None, "Please include either section name or introduction text") 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
kwargsinitial = 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?