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

2024-10-06 12:32:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习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


Tags: selfdatagetreturnrequestdef错误method
2条回答

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

这里的签名意味着方法参数应该与要重写的父类方法匹配。

首先你必须明白这是一个警告,而不是错误。

其次:Django传递给视图的每个参数(除了request)都是从URL中提取的,定义见urlpatterns。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)

但你也可以忽略这一点,按原样使用。您的使用有一些好处,例如在方法调用上自动验证所有必需的参数都已通过。使用默认方法签名(如上所述)不会在编辑器中引发警告。由你来决定哪个更好。

相关问题 更多 >