3

私の Django アプリには、スタイルが似ているいくつかの異なるフォームがあります。何度も何度も繰り返さないように、デフォルトのフォーム設定を書き直そうとします。

最初に、アプリで使用するすべてのフォームにいくつかのデフォルト設定を設定し、django.forms.Formをサブクラス化しようとしました。

class DefaultForm(forms.Form):
    error_css_class = 'alert'
    error_class = DivErrorList
    required_css_class = 'required'
    label_suffix = ':'
    auto_id = True

class TechnicalSurveyForm(DefaultForm):
    location = forms.CharField(label='GPS Location')
    satellite = forms.ModelChoiceField(queryset=get_satellites(), empty_label=None)
    modem_sn = forms.CharField()

私のviews.pyでは、単純にフォームを呼び出します

tsurvey = TechnicalSurveyForm()

残念ながら、 DefaultFormで設定した設定は適切ではありません (私が使用TechnicalSurvey(auto_id = True, error_class = DivErrorList)した場合)。だから、私のアプローチは何らかの形で完全に間違っていると思います。誰かが私を助けてくれますか?

4

1 に答える 1

6

フォームの属性__init__を初期化すると思います。Django が作業を行った後でforms.Form、メソッドをオーバーライドして属性を変更する必要があります。__init__

編集:実際、django ソース コードを確認すると、フォーム オブジェクトの属性が__init__関数内で初期化されていることがわかります。メソッドは django の github に表示されます。

class DefaultForm(forms.Form):
    def __init__(self, *args, **kwargs): 
        super(forms.Form, self ).__init__(*args, **kwargs)
        self.error_css_class = 'alert'
        self.error_class = DivErrorList
        self.required_css_class = 'required'
        self.label_suffix = ':'
        self.auto_id = True

Python初心者向け

この動作はまったく正常です。クラス宣言で宣言された同じ名前を持つすべての属性 (作成者の例のように) は、init 関数でも定義されている場合はオーバーライドされます。これら 2 種類の属性宣言にはわずかな違いがあります。

于 2013-08-02T15:08:07.047 に答える