基于Django类的视图实例变量

时间:2015-03-07 01:08:55

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

这个类(在Django 1.7.4中)我不明白......在form_valid()函数中:

class ImportCsv(FormView):
    template_name = "backend/import.html"
    form_class = UploadFileForm
    success_url = reverse_lazy("b_import_csv")
    csverrors = []

    def get_context_data(self, **kwargs):
        ctx = super(ImportCsv, self).get_context_data(**kwargs)
        ctx.update({
                "csverrors" : self.csverrors,
            })
        return ctx

    def form_valid(self, form):
        self.csverrors.append("Yeah")
        self.template_name+="yeah"
        return super(ImportCsv, self).form_valid(form)

这个类只显示了我无法理解的内容:一旦表单有效,就会调用form_valid()。在那里,我更改了两件事:self.csverrorsself.template_name

然后我重新加载我的页面:模板名称仍然是原始名称,但是csverrors会记住"是的"。我可以一次又一次地提交表单:csverrors不断增长。关键是:我也可以更改self.form_classself.success_url,但所有内容都将在下一次连接中恢复。为什么csverrors仍然存在?

我看不出这两个变量之间的差异以及它们为什么表现不同。在这种特殊情况下我知道函数get_gemplate_names(),但这是关于实例变量的一般性问题。

目标只是将某些内容放入实例变量中,并相应地将get_success_url()更改为该变量。问题:该变量不会消失。

1 个答案:

答案 0 :(得分:4)

无论csverrors次观看次数多少,

ImportCsv都会指向单个列表。此列表是在您定义ImportCsv类时创建的,并且从不再次重新创建。

因此,您应该在form_valid()

中创建新列表
def form_valid(self, form):
    self.csverrors = ["Yeah"]
    ...

或者在dispatch()方法中创建新的空列表:

class ImportCsv(FormView):

    def dispatch(self, *args, **kwargs):
        self.csverrors = []
        return super(ImportCsv, self).dispatch(*args, **kwargs)