[Django] #34532: Overriding ModelForm default_renderer has no effect as forms api always uses renderer from settings

9 views
Skip to first unread message

Django

unread,
May 3, 2023, 12:27:43 AM5/3/23
to django-...@googlegroups.com
#34532: Overriding ModelForm default_renderer has no effect as forms api always
uses renderer from settings
-------------------------------------+-------------------------------------
Reporter: Ryan Burt | Owner: nobody
Type: | Status: new
Uncategorized |
Component: Forms | Version: 4.2
Severity: Normal | Keywords: default_renderer
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
Overriding default_renderer functionality in the ModelForm class

This issue only came into effect on my project upon upgrading from 3.2 to
4.2


settings.py:
{{{
FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
}}}


myapp/forms.py:
{{{
class MyModelForm(forms.ModelForm):
default_renderer = CustomRenderer

class Meta:
model = MyModel

}}}

Each time the forms api hits the forms.forms.BaseForm.__init__() method in
forms/forms.py, renderer is always not null and the condition for using
the default_renderer is never reached:

{{{

(line 120 in forms/forms.py)
# Initialize form renderer. Use a global default if not specified
# either as an argument or as self.default_renderer.
if renderer is None:
if self.default_renderer is None:
renderer = get_default_renderer()
else:
renderer = self.default_renderer
if isinstance(self.default_renderer, type):
renderer = renderer()
self.renderer = renderer


}}}

Different FORM_RENDERER values seem to have no effect. If I override the
ModelForm init method the renderer is passed in the kwargs, so it is
possible to set it to None. I'm interested in understanding if I have a
compatibility issue in my settings as a result of upgrading versions, or
if the above code block could be restructured to preference
default_renderer if it is not none:

{{{
# Initialize form renderer. Use a global default if not specified
# either as an argument or as self.default_renderer.
if self.default_renderer:
if isinstance(self.default_renderer, type):
renderer = self.default_renderer()
else:
renderer = self.default_renderer
elif renderer is None:
renderer = get_default_renderer()
self.renderer = renderer
}}}

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

Django

unread,
May 3, 2023, 12:29:07 AM5/3/23
to django-...@googlegroups.com
#34532: Overriding ModelForm default_renderer has no effect as forms api always
uses renderer from settings
----------------------------------+--------------------------------------

Reporter: Ryan Burt | Owner: nobody
Type: Bug | Status: new
Component: Forms | Version: 4.2
Severity: Normal | Resolution:
Keywords: default_renderer | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
----------------------------------+--------------------------------------
Changes (by Ryan Burt):

* type: Uncategorized => Bug


--
Ticket URL: <https://code.djangoproject.com/ticket/34532#comment:1>

Django

unread,
May 3, 2023, 12:55:33 AM5/3/23
to django-...@googlegroups.com
#34532: Overriding ModelForm default_renderer has no effect as forms api always
uses renderer from settings
----------------------------------+--------------------------------------
Reporter: Ryan Burt | Owner: nobody
Type: Bug | Status: closed
Component: Forms | Version: 4.2
Severity: Normal | Resolution: needsinfo

Keywords: default_renderer | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
----------------------------------+--------------------------------------
Changes (by Mariusz Felisiak):

* cc: David Smith (added)
* status: new => closed
* resolution: => needsinfo


Comment:

Can you provide a sample project that reproduces the issue? How do you
initialize forms? Please reopen the ticket if you can provide more
details.

> or if the above code block could be restructured to preference
default_renderer if it is not none

Unfortunately not, the `renderer` explicitly passed in the arguments
should always be preferred as `default_renderer` is a fallback.

--
Ticket URL: <https://code.djangoproject.com/ticket/34532#comment:2>

Django

unread,
May 3, 2023, 1:19:36 AM5/3/23
to django-...@googlegroups.com
#34532: Overriding ModelForm default_renderer has no effect as forms api always
uses renderer from settings
----------------------------------+--------------------------------------
Reporter: Ryan Burt | Owner: nobody
Type: Bug | Status: closed
Component: Forms | Version: 4.2
Severity: Normal | Resolution: needsinfo
Keywords: default_renderer | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
----------------------------------+--------------------------------------

Comment (by Ryan Burt):

I'll provide a sample project shortly, but to answer the second question,
I'm initializing my forms through the modelformset_factory.

This got me on the right track, I've reviewed the code in
forms/formsets.py and the renderer is passed in the attrs via `'render':
renderer or get_default_renderer()` on line 571.
This an addition from commit
[https://github.com/django/django/commit/456466d932830b096d39806e291fe23ec5ed38d5
456466d].


If I suppress `FORM_RENDERER` in my settings.py, `get_default_renderer()`
returns the default of 'django.forms.renderers.DjangoTemplates', so this
could be an unintended consequence of the changes in that commit

--
Ticket URL: <https://code.djangoproject.com/ticket/34532#comment:3>

Django

unread,
May 3, 2023, 1:20:36 AM5/3/23
to django-...@googlegroups.com
#34532: Overriding ModelForm default_renderer has no effect as forms api always
uses renderer from settings
----------------------------------+--------------------------------------
Reporter: Ryan Burt | Owner: nobody
Type: Bug | Status: new

Component: Forms | Version: 4.2
Severity: Normal | Resolution:
Keywords: default_renderer | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
----------------------------------+--------------------------------------
Changes (by Ryan Burt):

* status: closed => new
* resolution: needsinfo =>


--
Ticket URL: <https://code.djangoproject.com/ticket/34532#comment:4>

Reply all
Reply to author
Forward
0 new messages