从基于自定义类的视图继承的基于类的视图看不到父级中的上下文变量

时间:2018-07-25 14:46:08

标签: python django django-class-based-views

我已经编写了一个基于类的视图,该视图充当了其他几个基于类的视图的基础视图。因此,其他基于类的视图只是对基础视图进行子类化,但是子类化的视图未获得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函数,但是如果仅使用基本句柄(如上所示),则这些函数会运行?

1 个答案:

答案 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!