Django - 方法的签名与类中基本方法的签名不匹配

时间:2017-08-07 20:23:57

标签: python django

我正在学习Django,我正在学习lynda.com课程。 在其中一个“建立电子教学网站”课程中,有以下代码:

class CourseModuleUpdateView(TemplateResponseMixin, View):
    template_name = 'courses/manage/module/formset.html'
    course = None

    def get_formset(self, data=None):
        return ModuleFormSet(instance=self.course,
                             data=data)

    def dispatch(self, request, pk):
        self.course = get_object_or_404(Course, id=pk, owner=request.user)
        return super(CourseModuleUpdateView, self).dispatch(request, pk)

    def get(self, request, *args, **kwargs):
        formset = self.get_formset()
        return self.render_to_response({'course': self.course,
                                        'formset': formset})

    def post(self, request, *args, **kwargs):
        formset = self.get_formset(data=request.POST)
        if formset.is_valid():
            formset.save()
            return redirect('manage_course_list')
        return self.render_to_response({'course': self.course,
                                        'formset': formset})

但是我收到来自PyCharm(我的IDE)的错误消息:

def dispatch(self, request, pk):

错误是:

Signature of method 'CourseModuleUpdateView.dispatch()' does not match signature of base method in class 'View' less... (Ctrl+F1) 
This inspection detects inconsistencies in overriding method signatures.

我有没有办法解决问题,看看如何开始修复错误?什么是Pycharm甚至试图告诉我??

我正在使用python 3和DJango 1.11

2 个答案:

答案 0 :(得分:2)

您正在覆盖父类dispatch的方法View,其签名为def dispatch(self, request, *args, **kwargs):,您可以从中查看该方法不匹配。

此处签名意味着方法参数应与您要覆盖的父类方法匹配。

答案 1 :(得分:0)

首先,您必须了解这是一个警告,而不是错误。

第二:Django传递给视图的每个参数(request除外)都是从urlpatterns中定义的URL中提取的。 Django在基于类的视图中内部使用*args**kwargs,因此您可以传递任何参数而无需覆盖dispatch方法。

再回到我们的警告:许多静态代码分析工具(包括内置在PyCharm中的工具)都会发出此警告,以通知您此处可能有问题,因为原始的分派方法具有不同的签名。这并不意味着这是错误的,这就是为什么总是有一些选项可以使选定的代码行上的那些警告静音。当然,您应该查看编辑器提出的每条警告,但这并不意味着每条警告都应得到解决。

您当然可以使用以下方法修复它:

    def dispatch(self, request, *args, **kwargs):
        id = args[0] # or id = kwargs['id'] if it is passed as keyword argument
        self.course = get_object_or_404(Course, id=pk, owner=request.user)
        return super(CourseModuleUpdateView, self).dispatch(request, pk)

,但是您也可以忽略它并按原样使用。您的用法有一些好处,例如,对方法调用的自动验证已传递了所有必需的参数。结合使用默认方法签名(如上所述)的好处是不会在编辑器中发出该警告。由您决定哪个更好。