2017-09-28 3 views
0

リストを繰り返し処理してその要素を更新すると、リスト自体は更新されません。iterationでフォームセットのフォームを変更する方法

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

それは

コード以下はXさんは、私のプロジェクトのいずれかに属し、[ 'A'、 'B'、 'C​​']ない出力します。

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 

リスト要素を更新し、それが反復処理していたリストに影響します。

なぜ、formsetフォームがforループ修飾の影響を受けるのですか?

+0

'a [b] = c'を実行すると、元々は' a .__ setitem __(b、c) 'であるため、実際には元のリスト自体を変更しています。 – HyperNeutrino

+0

しかし、私はform.fields [field]。 attrs ['readonly'] = True、self.formset_instance [1] .fields [field] .widget.attrs ['readonly'] = True – durdenk

答えて

1

どのように変数の参照は、実際には意味「a表現1によって運ばれる値のエイリアスを作る」

a = 1

を働きます。 a = 1 + 2は本当にただ「 1 + 2を評価し、その結果のため aとエイリアスを作る。

をしかし、a[0] = 1手段 『は』表現1aの最初の値を設定すること。

をので、あなたがしている場合。あなたは、本質的に反復可能で、それぞれの値を通過していると、それぞれの値のために、あなたはその値にformを設定し、リストをループすると、リスト内form = aを行うと、ちょうどformの意味を変更します。form[0] = aを行うと、formを変更します。

変更しない場合は、form = form[:]を使用してループの最初にフォームを複製することを検討してください。

ここで変数がどのように機能するかの概念がはっきりしていることを願っています。それは少し混乱することができます!

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' 

最初の例ではないので、何も変わりません。

関連する問題