Проблема Django «аргумент super () 1 должен быть типом, а не WSGIRequest» в Python 3 - PullRequest
0 голосов
/ 19 января 2019

При использовании наследования классов Python 3 завершается с super() argument 1 must be type, not WSGIRequest.

Я нахожусь на Django 2.1.4 и Python 3.7.0.Я пытаюсь увидеть, отправил ли пользователь уже файл для анализа, если нет, он перенаправлен на страницу отправки.Я пытался не использовать статические методы, проверьте, действительно ли это Python 3 (потому что эта проблема характерна для Python 2), в суперклассе, который я пытался унаследовать от «объекта», а также от «Представления», предоставленного Django.(поскольку это решает в Python 2 аргумент super () 1 должен быть типом, а не None ).

Это суперкласс, он наследуется от класса, предоставленного Django "View".

class DatasetRequired(View):

    @staticmethod
    def get(request):
        <redirects the user>

Это базовый класс

class Estatisticas(DatasetRequired):

    @staticmethod
    def get(request):
        super(request)
        <do various other stuff>

Я ожидаю, что функция get базового класса при вызове вызовет функцию суперкласса get и проверит,пользователь уже отправил файл.

Я получаю:

TypeError at /estatisticas super() argument 1 must be type, not WSGIRequest

1 Ответ

0 голосов
/ 19 января 2019

Вы неправильно поняли, как использовать super().Вы передаете текущий класс и экземпляр или класс для второго аргумента, а не объект request.Результатом этого вызова является специальный объект, который знает, как найти и связать атрибуты в родительских классах, игнорируя текущий класс.

В контексте staticmethod вы должны передать текущий класс как оба аргумента :

class Estatisticas(DatasetRequired):
    @staticmethod
    def get(request):
        super(Estatisticas, Estatisticas).get(request)
        # <do various other stuff>

Я действительно не уверен, почему вы используете staticmethod здесь.При обработке запроса для представления создается специальный экземпляр, поэтому обычно вы используете обычные методы экземпляра .На этом этапе в Python 3 вы можете использовать super() без аргументов:

class DatasetRequired(View):

    def get(self, request):
        # <redirects the user>

class Estatisticas(DatasetRequired):

    def get(self, request):
        super().get(request)
        # <do various other stuff>

В Python достаточно контекста, чтобы понять, что super() нужны Estatisticas и self в качестве аргументов без васназвать их.

...