0

いくつかのフォームを提供する 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=())

明らかに、多くの可動部分。このコードにはあまり満足していません。これらのハックに頼らずに、フォームに対する設定の効果を適切にテストするにはどうすればよいですか?

4

1 に答える 1

0

あなたが何をしようとしているのか分かりません。しかし、アドバイスとして、これはよりオブジェクト指向の方法で考えるべきです。たとえば、そのifステートメントを使用する代わりに、すべてを定義し、使用するものをプラグインする必要があります。

2 つのフォームがあり、そのうちの 1 つを毎回使用したい場合は、次のような設定を行うことができます。

settings.FORM_TO_USE = CurrencyForm

インスタンス化する場合は、次のことができます。

def my_view(request):
    form = settings.FORM_TO_USE()

最後に、構成とは別にテストを管理してみてください。django の単体テストを行っている場合、設定が何であるかは気にする必要はありません。

于 2012-11-17T13:55:15.057 に答える