【问题标题】:CourseModuleUpdateView didn't return an HttpResponse object. It returned None insteadCourseModuleUpdateView 没有返回 HttpResponse 对象。它返回 None 而不是
【发布时间】:2017-11-04 16:28:44
【问题描述】:

我有以下类用于使用表单集显示相关课程模块

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')

发出获取请求我收到以下错误

追溯:

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.

我的代码有什么问题!我正在使用 django 1.11

【问题讨论】:

  • 你能不能在 dispatch 方法中使用 "return super(CourseModuleUpdateView, self).dispatch(request, *args, **kwargs)"。
  • 谢谢老哥,成功了!但是我为什么要返回`super().dispatch()`,因为它在它的父节点上返回 get 和 post 句柄!

标签: python django


【解决方案1】:

根据 Django documentation 调度方法应该返回一个 HTTP 响应。

调度(请求,*args,**kwargs)¶

视图的视图部分—— 接受请求参数和参数的方法,返回一个 HTTP 响应。

根据您的代码进行解释。

来自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 方法不仅将请求的方法委托给相应的处理程序,它还 r返回处理程序响应

即,在这一行中。

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 方法 即,

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

返回一个有效的 HTTP 响应。

这个响应会到达调用get方法的地方。即,在Views 调度方法内部。从那里它将返回调用它的响应,即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.

【讨论】:

    猜你喜欢
    • 2019-10-13
    • 2019-06-12
    • 2016-08-08
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    相关资源
    最近更新 更多