【问题标题】:error: view didn't return HttpResponse object in generic class based views using mixin in Django?错误:在 Django 中使用 mixin 的视图没有在基于通用类的视图中返回 HttpResponse 对象?
【发布时间】:2014-07-10 13:28:05
【问题描述】:

我正在写一个mixin,它可以部分保存form。有关这方面的更多详细信息,请参阅我的previous post.。虽然这是固定的,但我还有另一个错误。我认为错误来自post method 混合不返回HttpResponse Object。我正在打一个super 电话,应该会解决这个问题。但这没有用。

错误:

Exception Type:     ValueError
Exception Value:    The view blog.views.ArticleCreateView didn't return an HttpResponse object.

这是 mixin:

class PendFormMixin(object):
    form_hash_name = 'form_hash'
    pend_button_name = 'pend'
    def get_form_kwargs(self):
        """
        Returns a dictionary of arguments to pass into the form instantiation.
        If resuming a pended form, this will retrieve data from the database.
        """
        form_hash = self.kwargs.get(self.form_hash_name)
        print "form_hash", form_hash
        if form_hash:
            import_path = self.get_import_path(self.get_form_class())
            return {'data': self.get_pended_data(import_path, form_hash)}
        else:
            print "called"
            # print super(PendFormMixin, self).get_form_kwargs()
            return super(PendFormMixin, self).get_form_kwargs()

    def post(self, request, *args, **kwargs):
        """
        Handles POST requests with form data. If the form was pended, it doesn't follow
        the normal flow, but saves the values for later instead.
        """
        self.object = None
        if self.pend_button_name in self.request.POST:
            print "here"
            form_class = self.get_form_class()
            print form_class
            form = self.get_form(form_class)
            # print "form is ", form
            self.form_pended(form)
            super(PendFormMixin, self).post(request, *args, **kwargs)
        else:
            super(PendFormMixin, self).post(request, *args, **kwargs)

# Custom methods follow
    def get_import_path(self, form_class):
        return '{0}.{1}'.format(form_class.__module__, form_class.__name__)

    def get_form_hash(self, form):
        content = ','.join('{0}:{1}'.format(n, form.data[n]) for n in form.fields.keys())
        return md5(content).hexdigest()

    def form_pended(self, form):
        import_path = self.get_import_path(self.get_form_class())
        form_hash = self.get_form_hash(form)
        print "in form_pended"
        pended_form = PendedForm.objects.get_or_create(form_class=import_path,
                                                       hash=form_hash)
        print "form_class", import_path
        print "form_hash", form_hash
        print "pended_form", pended_form
        for name in form.fields.keys():
            pended_form[0].data.get_or_create(name=name, value=form.data[name])
        print pended_form[0]
        return form_hash

    def get_pended_data(self, import_path, form_hash):
        data = PendedValue.objects.filter(import_path=import_path, form_hash=form_hash)
        return dict((d.name, d.value) for d in data)

这是视图:

class ArticleCreateView(PendFormMixin, CreateView):
      form_class = ArticleForm
      model = Article
      template_name = "article_create.html"
      success_url = '/admin'

      def form_valid(self, form):
        """
        If the request is ajax, save the form and return a json response.
        Otherwise return super as expected.
        """
        if self.request.is_ajax():
            self.object = form.save()
            time.sleep(5)
            return HttpResponse(json.dumps("success"),
                mimetype="application/json")
        return super(ArticleCreateView, self).form_valid(form)

      def form_invalid(self, form):
        """
        We haz errors in the form. If ajax, return them as json.
        Otherwise, proceed as normal.
        """
        if self.request.is_ajax():
            return HttpResponseBadRequest(json.dumps(form.errors),
                mimetype="application/json")
        return super(ArticleCreateView, self).form_invalid(form)

【问题讨论】:

    标签: django mixins django-class-based-views django-generic-views


    【解决方案1】:

    基于类的视图的post 方法应该返回一个HttpResponse 对象(显然,正如异常所说)。在你的 mixin 中,你忘了返回一些东西,因此出现了错误。您只需要从CreateViewsuper() 调用返回结果:

    def post(self, request, *args, **kwargs):
        """
        Handles POST requests with form data. If the form was pended, it doesn't follow
        the normal flow, but saves the values for later instead.
        """
        self.object = None
        if self.pend_button_name in self.request.POST:
            # You do things there
    
        # It is the same line, you don't need an else block then. Note the "return"
        return super(PendFormMixin, self).post(request, *args, **kwargs)
    

    【讨论】:

    【解决方案2】:

    调用 super() 不会让你的方法返回任何东西,它只会调用超类。您应该在 PendFormMixin.post() 方法中使用 return super(...)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-06
      • 2017-03-28
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      相关资源
      最近更新 更多