いくつかのフォームを提供する Django 用のプラグ可能なアプリがあります。フォームには、フォームの動作の一部 (ラベル、初期値など) を制御するいくつかの設定が関連付けられています。
プラグイン可能なアプリのデフォルト設定を設定するためにブログ投稿をたどりましたが、通常の状況では問題なく動作します。ただし、オーバーライドを提供するテストでは、オーバーライドはまったく適用されません。
フォームの 1 つのコードを次に示します。
if settings.CURRENCY_FORM_INCLUDE_EMPTY:
currencies.insert(0, (settings.CURRENCY_FORM_EMPTY_VALUE,
settings.CURRENCY_FORM_EMPTY_LABEL))
class CurrencyForm(forms.Form):
currency = forms.ChoiceField(
required=False,
choices=currencies,
label=settings.CURRENCY_FORM_LABEL,
initial=settings.CURRENCY_FORM_INITIAL_VALUE)
明らかに、クラスが定義された瞬間、ラベルや初期値などの設定がすぐに適用されるため、オーバーライドはそれらに影響しません。
__init__
フォームのメソッドですべての設定を評価するという、かなりハックなソリューションになりました。
class CurrencyForm(forms.Form):
def __init__(self, *args, **kwargs):
super(CurrencyForm, self).__init__(*args, **kwargs)
choices = list(currencies)
if settings.CURRENCY_FORM_INCLUDE_EMPTY:
choices.insert(0, (settings.CURRENCY_FORM_EMPTY_VALUE,
settings.CURRENCY_FORM_EMPTY_LABEL))
self.fields['currency'].label = settings.CURRENCY_FORM_LABEL
self.fields['currency'].choices = choices
self.fields['currency'].initial = kwargs.get(
'initial', {}
).get('currency', settings.CURRENCY_FORM_INITIAL_VALUE)
currency = forms.ChoiceField(required=False,
choices=())
明らかに、多くの可動部分。このコードにはあまり満足していません。これらのハックに頼らずに、フォームに対する設定の効果を適切にテストするにはどうすればよいですか?