我已经尝试解决了一段时间,但是看不出错误消息的真实情况。我收到此错误消息:
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:返回对象
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,最后一件事似乎是返回一个对象,但仅此而已。
有什么想法为什么不起作用?