2

プロジェクトに Django を使用しています。そして、Django フォームを使用してフォームを作成しました。フォームの 1 つで、変数をチェックする必要があり、変数の値に基づいて、要素を追加または削除する必要があります。

オブジェクトが初期化されるときに、この変数をフォームに渡します。すなわちform=MyForm(flag)

そして、フォームクラスで私はこれをやっています

class MyInfoForm(forms.Form):
    def __init__(self, *args,**kwargs):
        self.flag= kwargs.pop('flag', None)
        super(MyInfoForm, self).__init__(*args, **kwargs)
        print self.flag

    Firstname = forms.CharField(label=u' First name :', max_length=30)

init 関数で、フラグとその動作を正常に出力しました。 しかし、私が試した変数out side initにアクセスするにはどうすればよいですか

    class MyInfoForm(forms.Form):
        myFlag=None
        def __init__(self, *args,**kwargs):
            self.flag= kwargs.pop('flag', None)
            myFlag=self.flag
            super(MyInfoForm, self).__init__(*args, **kwargs)
            print self.flag

        Firstname = forms.CharField(label=u' First name :', max_length=30)
        print myFlag

しかし、うまくいきません。

4

3 に答える 3

3

このclassステートメントは、次のような実行可能なステートメントです。

  1. 名前空間を作成します
  2. クラスステートメントブロックの最上位にあるすべてのコードを順番に実行する
  3. typeクラス名、名前空間、および親クラスのリストを使用して、適切なメタクラス (デフォルトは ) を呼び出します。
  4. 新しく作成されたclassオブジェクトを、それを囲む (通常はモジュール) 名前空間のクラス名にバインドします

簡単に言うとclass、インスタンスもクラス自体もまだ存在しないため、ステートメント本体内からインスタンス属性にアクセスすることはできません。

インスタンスごとにフィールドを更新/追加/削除し、フォームの初期化子に渡された引数に従って必要な場合、正しい解決策は最初に親の初期化子を呼び出すことです (フォームのインスタンス フィールドが正しく初期化されていることを確認します)。次に、あなたがしなければならないことは何でもします。

class MyInfoForm(forms.Form):
    firstname = forms.CharField(label=u' First name :', max_length=30)
    def __init__(self, *args,**kwargs):
        self.flag= kwargs.pop('flag', None)
        super(MyInfoForm, self).__init__(*args, **kwargs)
        if self.flag:
            # XXX IMPORTANT : 
            # you want to access self.fields['fieldname']                
            # NOT self.fieldname
            self.fields["firstname"].label = "Yadda"
于 2012-07-04T10:17:14.457 に答える
0
print MyInfoForm.myFlag

これでどうですか?

于 2012-07-04T09:40:42.060 に答える
0

これは依存します... flag のスコープはクラス、またはクラスのインスタンスである必要がありますか?

スコープがインスタンスである必要がある場合 (これは、最初の試行のように見えます)、次のようにしてアクセスします。

instance = MyInfoForm(flag)
...
instance.flag

一方、変数 flag がクラスに属している場合 (つまり、MyInfoForm のすべてのインスタンスに対して flag の値が 1 つしかない場合)、次のようにしてアクセスできます。

MyInfoForm.myFlag #using your second attempt

また...変数を として宣言し、myFlag印刷しようとしていますmyflag。変数名は大文字と小文字が区別されます。

于 2012-07-04T09:43:18.313 に答える