3

いくつかの日付フィールドを持つモデルにモデルフォームセットがあります。これもモデルのDateTimeFieldです。ただし、テンプレートに表示される場合は、テキストフィールドとして表示されます。ドロップダウンボックスとして表示するにはどうすればよいですか?

WFormSet = inlineformset_factory(UserProfile, W, can_delete=False,exclude=[<list of fields to be excluded>], extra=3) 

これが私がmodelformsetを初期化する方法です。

これらの設定を上書きするにはどうすればよいですか

4

1 に答える 1

6

これを行う通常の方法は、ModelForm 定義でデフォルトのフィールド タイプをオーバーライドすることです。

以下の例は、モデルに DateField がある場合に機能します (DateTimeField があることに注意してください...すぐに戻ってきます)。通常指定されるものとまったく同じフィールド タイプを指定することになりますが、フォーム フィールド コンストラクターには別のウィジェットを渡します。

from django.db import models
from django import forms
from django.forms.extras import SelectDateWidget

class MyModel(models.Model):
    a_date_field = models.DateField()

class MyModelForm(forms.ModelForm):
    a_date_field = forms.DateField(widget=SelectDateWidget())

    class Meta:
        model = MyModel

私の知る限り、DateTimeFieldDjango 1.0.x で提供されている同等のウィジェットはありません。この場合、カスタム ウィジェットを作成し、サブクラス化する必要がありますSelectDateWidget。簡単なグーグルでSelectDateTimeWidget、あなたが探しているウィジェットのように見えるものを作っている人が他にも何人かいることに注意してください。私はそれらを使用していないので、emptor に注意してください。ただし、この SelectDateTimeWidget パッチのようなものから始めるのがよいでしょう。


編集: ModelFormset または InlineModelFormset を使用する場合でもform=MyModelForminlineformet_factory関数に渡すことでこれを実現できます。

MyModelFormset = inlineformset_factory(MyParentModel, MyModel, form=MyModelForm)

これが機能するのは、2 つのモデル フォームセット ファクトリが実際にformset_factory独自の実装で通常のコンストラクタを呼び出すためです。ドキュメントに明示的に記載されていないため、理解するのは少し難しいです...むしろ、Django ドキュメントでは、モデルのフォームセット ファクトリが通常の formset_factory を拡張することを言及することで、この機能をほのめかしています。疑問があるときはいつでもdjango/forms/models.py、フォームセット ファクトリ関数の完全な署名を確認するために開きます。

于 2009-05-18T18:00:26.897 に答える