1

シンプルなイベント アプリを作成しようとしているので、イベントといくつかのインライン イベントの発生を作成することにしました。

class EventOccurenceInline(admin.TabularInline):
    model = models.EventOccurance
    form = forms.EventOccuranceForm
    pass


class EventAdmin(TranslatableAdmin):
    list_display = [ "internal_name"]
    inlines = [
        EventOccurenceInline,
    ]
    pass

ここにforms.pyがあります:

class EventOccurenceForm(TranslatableModelForm):
    start_date = forms.DateTimeField()
    end_date = forms.DateTimeField()
    class Meta:
        model = models.EventOccurence

しかし、バックエンドを開くと、DateTime ピッカーの代わりに単純な入力しか表示されず、それらのフィールドのラベルでさえ何も言いません:

スクリーンショット

これらのウィジェットをインライン内で使用する方法を知っている人はいますか? 私は何を間違っていますか?

前もって感謝します、マイケル

4

1 に答える 1

2

問題は、引数なしでクラス内のstart_dateandend_dateフィールドを宣言していることです。EventOccurenceForm

以下は、デフォルトのフィールド タイプまたはウィジェットのオーバーライドセクションの Django の「モデルからフォームを作成する」ドキュメントからの引用です。

このようにフォーム フィールドを明示的にインスタンス化すると、Django はその動作を完全に定義する必要があると想定します。したがって、デフォルトの属性 (max_lengthまたは などrequired) は、対応するモデルから取得されません。モデルで指定された動作を維持したい場合は、フォーム フィールドを宣言するときに、関連する引数を明示的に設定する必要があります。

とにかく、なぜクラスでstart_dateandend_dateフィールドを宣言しているのですか? EventOccurenceFormフォームにこれらの 2 つのフィールドのみを含めようとしているからですか? その場合は、代わりfieldsに内部Metaクラスの属性を使用する必要があります。

EventOccurenceモデルstart_dateend_dateフィールドはs であると想定しているDateFieldため、Django 管理内では、AdminDateWidgetデフォルトでウィジェットがあります。何らかの理由でそうではなく、モデルを変更できない場合は、次のようにクラスの内部クラスのwidgets属性をいつでも使用できます。EventOccurenceFormMeta

from django.contrib.admin.widgets import AdminDateWidget

class EventOccurenceForm(TranslatableModelForm):
    class Meta:
        model = models.EventOccurence
        widgets = {
            'start_date': AdminDateWidget,
            'end_date': AdminDateWidget,
        }
于 2013-01-29T04:59:45.417 に答える