Правильный способ переопределить django admin add_view () - PullRequest
0 голосов
/ 01 августа 2020

Мне нужно переопределить представление add_view() в django admin, которое вызывается всякий раз, когда я пытаюсь добавить новый экземпляр модели.

Что я пробовал:

class BaseMarketModelAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.creator = request.user
        return super().save_model(request, obj, form, change)

    def add_view(self, request, form_url='', extra_context=None):
        try:
            super(BaseMarketModelAdmin, self).add_view(
                request, form_url, extra_context
            )
        except ValidationError as e:
            return handle_exception(self, request, e)

    def change_view(self, request, object_id, form_url='', extra_context=None):
        try:
            return super(BaseMarketModelAdmin, self).change_view(
                request, object_id, form_url, extra_context
            )
        except ValidationError as e:
            return handle_exception(self, request, e)

1007 * работает без проблем, но когда я пытаюсь добавить новый экземпляр модели с помощью кнопки «Добавить имя модели» в django admin, я всегда получаю следующее исключение:

AttributeError at /admin/market/exchange/add/
'NoneType' object has no attribute 'has_header'
Request Method: GET
Request URL:    http://127.0.0.1:8000/admin/market/exchange/add/
Django Version: 3.0.3
Exception Type: AttributeError
Exception Value:    
'NoneType' object has no attribute 'has_header'
Exception Location: /usr/local/lib/python3.7/site-packages/django/utils/cache.py in patch_response_headers, line 243
Python Executable:  /usr/local/bin/python
Python Version: 3.7.7

Я пытался проверить исходный код django s add_view(), который помещается в: django / contrib / admin / options.py , и кажется, что он вызывает только change_view() без object_id. Затем я попробовал это:

def add_view(self, request, form_url='', extra_context=None):
    return self.changeform_view(request, None, form_url, extra_context)

И он правильно загружает новую страницу экземпляра, но НЕ вызывает мое BaseMarketModelAdmin.change_view() представление!

Затем я попробовал это:

def add_view(self, request, form_url='', extra_context=None):
    return BaseMarketModelAdmin.changeform_view(request, None, form_url, extra_context)

Но это приводит к следующему исключению:

AttributeError at /admin/market/exchange/add/
'NoneType' object has no attribute 'COOKIES'
Request Method: GET
Request URL:    http://127.0.0.1:8000/admin/market/exchange/add/
Django Version: 3.0.3
Exception Type: AttributeError
Exception Value:    
'NoneType' object has no attribute 'COOKIES'
Exception Location: /usr/local/lib/python3.7/site-packages/django/middleware/csrf.py in _get_token, line 170
Python Executable:  /usr/local/bin/python
Python Version: 3.7.7

Теперь мне нужно переопределить это add_view() представление. Как правильно это сделать?

1 Ответ

1 голос
/ 01 августа 2020

Отсутствует возвращаемое значение в методе add_view

    def add_view(self, request, form_url='', extra_context=None):
    try:
        return super(BaseMarketModelAdmin, self).add_view(
            request, form_url, extra_context
        )
    except ValidationError as e:
        return handle_exception(self, request, e)
...