4

これは、ModelForm のすべての Django 日付フィールドのデフォルト ウィジェットをどのように変更しますか?のフォローアップです。.

非常に多数のモデル (A-ZZZ など) があり、制御できない他の開発者の入力によって成長し、すべての日付フィールドの入力方法を変更したいとします (つまり、jQueryUI を使用する)。その新しいウィジェットを使用してすべての日付フィールドが確実に入力されるようにする最善の方法は何ですか?

引用された質問からの1つの提案は次のとおりです。

def make_custom_datefield(f):
   if isinstance(f, models.DateField):
       # return form field with your custom widget here...
   else:
       return f.formfield()

class SomeForm(forms.ModelForm): 
   formfield_callback = make_custom_datefield

   class Meta:
       # normal modelform stuff here...

ただし、明示的な ModelForm がない場合にこれを行うことは可能ですが、URL パターンはモデルから直接取得されますか? つまり、あなたのURL設定は次のようになります:

url(r'^A/?$', 'list_detail.object_list', SomeModelA)

SomeModelA は、バックグラウンドで Django によって ModelForm に変換されるモデル (フォームではない) です。

現在、私のシステムには各モデルのフォームがありません。フォームを明示的に作成する唯一のポイントは、以前のソリューションで提案された formfield_callback を追加することですが、これは DRY の原則に反し、エラーが発生しやすく、労力がかかります。

(最後のスレッドで提案されているように) 特別なウィジェットを持つ独自のフィールドを作成し、組み込みの代わりにそれを使用することを検討しました。それほど労働集約的ではありませんが、エラーが発生する可能性があります (ただし、優れた grep で修正できないものは何もありません)。

提案や考えを歓迎します。

4

1 に答える 1

7

これをプロジェクト全体で実行したいようです (つまり、場合によってはこれを実行しようとしているのではなく、実行中のアプリケーションですべての場合に実行しようとしています)。

1 つの可能性は、DateField クラス自体のウィジェット属性を置き換えることです。これは、中央の場所で行う必要があります...実行中のdjangoアプリのすべてのインスタンスによってロードされることが保証されている場所です。これにはミドルウェアが役立ちます。__init__それ以外の場合は、アプリのファイルに入れるだけです。

やりたいことは、forms.DateField クラス自体のウィジェット プロパティを再割り当てすることです。新しい DateField が作成されると、Django はコードがフィールド プロパティ定義で特定のウィジェットを指定しているかどうかを確認します。そうでない場合は、DateField のデフォルトが使用されます。あなたのシナリオのユーザーが実際に特定のウィジェットを定義した場合、グローバル API の変更にもかかわらず、それを尊重したいと思うでしょう。

デフォルトを他のウィジェットに強制する例としてこれを試してください...この場合は HiddenInput:

from django import forms
forms.DateField.widget = forms.HiddenInput

class Foo(forms.Form):
    a = forms.DateField()

f = Foo()
print f.fields['a'].widget
# results in <django.forms.widgets.HiddenInput object at 0x16bd910>
于 2009-03-20T00:31:47.187 に答える