Django TypeError: render() получил неожиданный аргумент ключевого слова 'renderer'

Я обновился до Django 2.1, и я вижу эту ошибку при загрузке интерфейса администратора:

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

render() got an unexpected keyword argument 'renderer'

Ответы

Ответ 1

Это почти наверняка из-за этого обратного-несовместимого изменения в Django 2.1:

  • Поддержка методов Widget.render() без аргумента renderer удаляется.

Возможно, у вас есть подклассы django.forms.widgets.Widget в вашем коде или в коде одной из ваших зависимостей. Код может выглядеть так:

from django.forms import widgets

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

Вам нужно исправить подпись метода render, чтобы он выглядел так:

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

Посмотрите исходный код widgets.Widget если вы хотите проверить.

Ответ 2

Как указано в этой статье

https://docs.djangoproject.com/en/2.1/releases/2.1/#features-removed-in-2-1

Поддержка методов Widget.render() без аргумента рендерера удалена.

Поэтому я решил эту проблему сам, закомментировав аргумент рендерера, который был возвращен и был неожиданным.

# renderer=self.form.renderer

Как исправить: Для этого я перешел к модулю boundfield.py, расположенному в указанном ниже пути к каталогу (Примечание. Ваш путь к каталогу определенно будет отличаться от моего), и я изменил метод as_widget, определенный в классе BoundField.

Прокомментируйте (#) или удалите строку для аргумента рендерера.

/home/codemask/Documents/DjangoProjects/BlogApp/venv/lib/python3.7/site-packages/django/forms/boundfield.py

Ниже приведен скриншот модификации, которую я вам подчеркнул: The underlined code is my solution