Flimm
Flimm

Reputation: 151328

Django TypeError: render() got an unexpected keyword argument 'renderer'

I've upgraded to Django 2.1, and I'm seeing this error when I load the admin interface:

TypeError at /admin/foo/bar/1/change/

render() got an unexpected keyword argument 'renderer'

Upvotes: 49

Views: 29092

Answers (4)

Aadil Rashid Najar
Aadil Rashid Najar

Reputation: 1

The actual issue with this problem is in as_widget() function of BoundField class located at the location:

your_env_path/lib/python3.11/site-packages/django/forms/boundfield.py

existing_code

def as_widget(self, widget=None, attrs=None, only_initial=False):
    #other code
    response = widget.render(
        name=self.html_initial_name if only_initial else self.html_name,
        value=value,
        attrs=attrs,
        renderer=self.form.renderer,
        )
    return response
 
#**update the above code to**
def as_widget(self, widget=None, attrs=None, only_initial=False):
    #other code
    try:
        response = widget.render(
        name=self.html_initial_name if only_initial else self.html_name,
        value=value,
        attrs=attrs,
        renderer=self.form.renderer,
        )
    except:
        response = widget.render(
        name=self.html_initial_name if only_initial else self.html_name,
        value=value,
        attrs=attrs
        )
    return response`

Upvotes: 0

user13572992
user13572992

Reputation: 21

Django is looking for a default renderer which can be set in settings.py

FORM_RENDERER = 'django.forms.renderers.DjangoTemplates'

Upvotes: 0

rk_cha_py
rk_cha_py

Reputation: 29

Its version and signature incompatibility issue. Go back to version - 2.0.8

pip3 install Django==2.0.8

Upvotes: -3

Flimm
Flimm

Reputation: 151328

This is almost certainly because of this backwards-incompatible change in Django 2.1:

  • Support for Widget.render() methods without the renderer argument is removed.

You may have subclassed django.forms.widgets.Widget in your code, or in the code of one of your dependencies. The code may look like this:

from django.forms import widgets

class ExampleWidget(widgets.Widget):
    def render(self, name, value, attrs=None):
        # ...

You need to fix the method signature of render, so that it looks like this:

    def render(self, name, value, attrs=None, renderer=None):

Have a look at the source code of widgets.Widget if you want to check.

Upvotes: 117

Related Questions