它如何在迭代中修改formset的表单

时间:2017-09-28 20:01:45

标签: python django

据我所知,如果你遍历列表并更新其元素,你就不会更新列表本身。

list_var = ['a','b','c']
for l in list_var:
    l = 'x'
print list_var

它打印出['a','b','c'],而不是X的

下面的代码属于我的一个项目。

    if hasattr(self.model, 'get_disabled_always_fields'):
        for field in self.model.get_disabled_always_fields():
            for form in self.formset_instance:
                try:
                    form.fields[field].widget.attrs['readonly'] = True
                except KeyError as e:
                    pass

它更新了list元素,它影响了我们迭代的列表。

问题是,为什么formset表单受到for循环修改的影响。

2 个答案:

答案 0 :(得分:1)

变量引用如何工作

a = 1实际上只是意味着“使a为表达式1所携带的值的别名”。 a = 1 + 2实际上只是意味着“评估1 + 2然后为a创建结果的别名。

但是,a[0] = 1表示“将a的第一个值设置为表达式1”。

因此,如果您循环遍历列表,那么您实际上是遍历iterable中的每个值,并且对于每个值,您将form设置为该值。在列表中执行form = a只会更改form的含义。执行form[0] = a会修改form

如果您不想修改它,请考虑使用form = form[:]在循环开始时克隆表单。

我希望在这种情况下变量如何工作的概念现在已经很清楚了;它可能有点令人困惑!

答案 1 :(得分:0)

在第一个示例中,您将list_var的元素分配给l,然后重新分配相同的l变量。

在第二个示例中,您使用的是form.fields[field].widget.attrs['readonly']而不是field(您通过其进行迭代)。所以如果你要这样做:

for field in self.model.get_disabled_always_fields():
    for form in self.formset_instance:
        field = 'something'  # or
        form = 'something2'

在第一个例子中没有什么会改变。