【问题标题】:Django class based view instance variables基于 Django 类的视图实例变量
【发布时间】:2015-05-08 17:37:37
【问题描述】:

这是一个类(在 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()。问题:该变量不会消失。

【问题讨论】:

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


    【解决方案1】:

    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)
    

    【讨论】:

      猜你喜欢
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 2013-08-03
      相关资源
      最近更新 更多