我已经编写了一个基于类的视图,该视图充当了其他几个基于类的视图的基础视图。因此,其他基于类的视图只是对基础视图进行子类化,但是子类化的视图未获得get_context_data或form_valid函数的作用,因此当使用来执行请求时,基础视图中设置的上下文变量不会被发送到模板。该视图是基础视图的子类,仅在使用基础视图本身时才发送。
基于类的视图:
class PortfolioNewBase(CreateView):
url_name = ''
post_req = False
def form_valid(self, form):
self.post_req = True
return super(PortfolioNewBase, self).form_valid(form)
def get_context_data(self, **kwargs):
context = super(PortfolioNewBase, self).get_context_data(**kwargs)
context['profile_id'] = self.kwargs['profile_id']
context['post_req'] = self.post_req
return super(PortfolioNewBase, self).get_context_data(**kwargs)
def get_success_url(self):
return reverse(self.url_name, args=self.kwargs['profile_id'])
在创建新的基于类的视图(该视图将使用此代码的视图之一)时,由于某种原因,它无法访问“ profile_id”或“ post_req”变量,因此不会发送给模板,但是如果仅使用上面编写的基本视图,则该视图将发送变量,以便它们在视图中可用。
使用上述基本视图的基于类的视图之一的代码:
class PortfolioNewDividend(PortfolioNewBase):
model = Dividend
form_class = DividendForm
template_name = 'plan/portfolio/new/new_dividend.html'
url_name = 'plan:investment-info-dividends-new'
该表单可以正常工作,但是由于某种原因,父级的get_context_data中的变量显然没有被继承,这是这里的重点,并且form_valid函数也未运行,即POST上的post_req的值基于PortfolioNewDividend类的视图完成的请求仍然具有False值。
为什么用该视图执行请求时,PortfolioNewDividend为什么不运行get_context_data和form_valid函数,但是如果仅使用基本句柄(如上所示),则这些函数会运行?
答案 0 :(得分:3)
一个super
在那里打了太多电话。更改如下:
def get_context_data(self, **kwargs):
context = super(PortfolioNewBase, self).get_context_data(**kwargs)
context['profile_id'] = self.kwargs['profile_id']
context['post_req'] = self.post_req
return context # You must actually return the modified context!