CourseModuleUpdateView未返回HttpResponse对象。它没有返回任何结果

2024-10-06 12:37:44 发布

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

我有下面的类来使用表单集显示相关的课程模块

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, *args, **kwargs):
        self.course = get_object_or_404(Course,
                                        id=kwargs['pk'],
                                        owner=request.user)
        super(CourseModuleUpdateView, self).dispatch(request, *args, **kwargs)

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

负责此CBV的Url模式

url(r'^(?P<pk>\d+)/module/$', views.CourseModuleUpdateView.as_view(), name='course_mudule_update')

发出get请求时出现以下错误

回溯:

File "/home/mtali/.virtualenvs/educa/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File "/home/mtali/.virtualenvs/educa/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  198.                 "returned None instead." % (callback.__module__, view_name)

Exception Type: ValueError at /courses/4/module/ Exception Value: The view courses.views.CourseModuleUpdateView didn't return an HttpResponse object. It returned None instead.

我的代码怎么了!我用的是django1.11


Tags: nameselfnonedatagetreturnresponserequest
1条回答
网友
1楼 · 发布于 2024-10-06 12:37:44

根据Django documentation,分派方法应该返回HTTP响应。你知道吗

dispatch(request, *args, **kwargs)¶

The view part of the view – the method that accepts a request argument plus arguments, and returns a HTTP response.

基于代码的解释。

从DjangoView类的源代码中

def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)

dispatch方法不仅将请求的方法委托给相应的处理程序,而且还返回处理程序响应。你知道吗

也就是说,在这条线上。你知道吗

return handler(request, *args, **kwargs)

在您的dispatch方法中调用super(CourseModuleUpdateView, self).dispatch(request, *args, **kwargs)时,这将调用超类的分派方法(即View类分派方法)。因为在dispatch方法上执行以下行之后,请求的http方法是GET

handler = getattr(self, request.method.lower(), self.http_method_not_allowed)

处理程序将被分配给get。所以在这种情况下,它大致相当于

def dispatch(self, request, *args, **kwargs):
    return get(request, *args, **kwargs)

这个get将调用CourseModuleUpdateView类中的get方法 i、 e

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

返回有效的HTTP响应。你知道吗

这个响应将到达调用get方法的地方。i、 例如,在View的分派方法中。它将从调用它的地方返回响应,即super(CourseModuleUpdateView, self).dispatch(request, *args, **kwargs)。由于没有返回从dispatch方法收到的响应,导致

Exception Type: ValueError at /courses/4/module/ Exception Value: The view courses.views.CourseModuleUpdateView didn't return an HttpResponse object. It returned None instead.

相关问题 更多 >