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.
* type: Uncategorized => Bug
--
Ticket URL: <https://code.djangoproject.com/ticket/34532#comment:1>
* 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>
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>
* status: closed => new
* resolution: needsinfo =>
--
Ticket URL: <https://code.djangoproject.com/ticket/34532#comment:4>