首页 > 解决方案 > 在 httpresponseredirect 中反转时,基于类的视图不返回 httpresponse?

问题描述

我一直在尝试解决这个问题一段时间,但不知道我得到的错误消息是如何发生的。我收到此错误消息:

The view plan.views.PortfolioReportEdit didn't return an HttpResponse object. It returned None instead.

从查看代码来看,从我的角度来看,它似乎确实会在任何地方返回一个 httpresponse。

这是代码,首先是父类/超类:

class PortfolioEditBase(UpdateView):
    post_req = False
    url_name = 'plan:view_investment_profile'

    def form_valid(self, form):
        self.post_req = True
        print "BASE: form_valid passed"
        return super(PortfolioEditBase, self).form_valid(form)

    def get_context_data(self, **kwargs):
        context = super(PortfolioEditBase, self).get_context_data(**kwargs)

        try:
            context['post_req'] = self.post_req
            context['profile_id'] = self.kwargs['profile_id']
            print "BASE: gathered context data"
            return context
        except KeyError:
            context['post_req'] = self.post_req
            print "BASE: gathered context data"
            return context

    def get_success_url(self):
        print "PortfolioEditBASE: in success_url"
        return reverse(self.url_name, args=self.kwargs['profile_id'])

这是子类的代码:

class PortfolioDividendEdit(PortfolioEditBase):
    model = Dividend
    form_class = DividendForm
    template_name = 'plan/portfolio/edit/dividend_edit.html'
    print "PortfolioDividendEdit: Inside start of function"

    def form_valid(self, form):
        if "delete" in self.request.POST:
            div_obj = Dividend.objects.get(id=self.kwargs['dividend_id'])
            profile_id = div_obj.profile_id
            div_obj.delete()
            return HttpResponseRedirect(reverse('plan:view_investment_profile', kwargs={'profile_id': profile_id}))

    def get_context_data(self, **kwargs):
        print "Inside get_context_data dividend"
        context = super(PortfolioEditBase, self).get_context_data(**kwargs)
        dividend_obj = Dividend.objects.get(id=self.kwargs['dividend_id'])
        profile = Profile.objects.get(id=dividend_obj.profile_id)
        context['post_req'] = self.post_req
        context['profile'] = profile
        context['dividend_id'] = self.kwargs['dividend_id']
        print "PortfolioDividendEdit: Returning context"
        print "PortfolioDividendEdit: context: " + str(context)
        return context

    def get_object(self, queryset=None):
        obj = Dividend.objects.get(id=self.kwargs['dividend_id'])
        print "PortfolioDividendEdit: Returning object"
        print "Object: " + str(obj)
        return obj

    def get_success_url(self):
        print "PortfolioDividendEdit: Inside get_success_url"
        dividend_obj = Dividend.objects.get(id=self.kwargs['dividend_id'])
        profile_id = dividend_obj.profile_id
        print "GET SUCCESS URL"
        print self.url_name
        print profile_id
        return HttpResponseRedirect(reverse(self.url_name, args=[profile_id]))

根据 django 的说法,子类不返回 HttpResponse ,我无法弄清楚它为什么不这样做,因为我返回的 HttpResponseRedirect 里面有一个反向的,我虽然可以工作,但由于某种原因不是。

这是来自日志的打印行的输出:PortfolioEditReport: Returning object

PortfolioEditReport: object is: Earnings report
Not Found: /plan/portfolio/investment-info-reports/edit/css/style.css
[06/Aug/2018 15:16:00] "GET /plan/portfolio/investment-info-reports/edit/css/style.css HTTP/1.1" 404 8627
PortfolioEditReport: Gathered context data
[06/Aug/2018 15:16:00] "GET /plan/portfolio/investment-info-reports/edit/1 HTTP/1.1" 200 7112
PortfolioEditReport: Returning object
PortfolioEditReport: object is: Earnings report
Internal Server Error: /plan/portfolio/investment-info-reports/edit/1
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 198, in _get_response
    "returned None instead." % (callback.__module__, view_name)
ValueError: The view plan.views.PortfolioReportEdit didn't return an HttpResponse object. It returned None instead.
[06/Aug/2018 15:16:02] "POST /plan/portfolio/investment-info-reports/edit/1 HTTP/1.1" 500 56676

它似乎永远不会执行 get_success_url ,最后一件事似乎是返回一个对象,仅此而已。

任何想法为什么这不起作用?

标签: pythondjangopython-2.7django-views

解决方案


推荐阅读