Python 3中Django问题:“super() argument 1 must be type, not WSGIRequest”

3

当使用类继承时,Python 3 报错 super()的第一个参数必须是类型,而不是WSGIRequest

我使用的是 Django 2.1.4 和 Python 3.7.0。我正在尝试查看用户是否已经提交了要分析的文件,如果没有,则将其重定向到提交页面。我尝试过不使用静态方法,检查它是否真的是 Python 3(因为此问题在 Python 2 上很常见),在超类中,我尝试从“object”继承,同时也从 Django 提供的“View”继承(因为这可以解决在 Python 2 中的问题:super() argument 1 must be type, not 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个回答

2
你误解了如何使用super()。你需要传递当前类和第二个参数的实例或类,而不是request对象。该调用的结果是一个特殊的对象,它知道如何通过忽略当前类来查找和绑定父类上的属性。
staticmethod上下文中,你需要将当前类作为两个参数都传递进去:
"最初的回答": 你对于使用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()需要Estatisticasself作为参数,无需您命名它们。

最初的回答

谢谢你的回答。非常详细。你是对的,没有@staticmethod更清晰。我以为staticmethod比普通方法更快。但似乎我不知道我在使用什么。问题是我没有收到错误消息,但似乎Django也没有在超类中重定向。 - testin3r
@testin3r:那可能是一个单独的问题,值得提出一个新的问题,抱歉。 - Martijn Pieters
没问题。看起来这个超类返回只是返回到基类,而不是返回到HTTP响应... - testin3r
@testin3r:是的,这只是一个方法调用。如果您从父类中的get()返回结果并且不想忽略该结果,则新的.get()方法应该使用该结果。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接