1

Django 1.4 と Grappelli を使用しています

同じモデルの変更ページとはまったく異なる管理者追加ページが必要です。異なるフィールドセット、異なる readonly_fields (実際には add ではありません)、異なるインライン (実際には add ではありません)。そして、送信されたら、通常の作成パスをたどるのではなく、ファクトリ関数に送信する必要があります。しかし、管理ページのように見えて機能する必要があり、特に、通常の管理ページで取得するような外部キー セレクターが必要です。

しばらくの間、get_readonly_fields とその友達をいじってみましたが、get_inline_instances は 1.5 のみで、インラインを削除するための別のフックが見つかりませんでした。

次に、get_urls を使用してビューとフォームを置き換えようとしましたが、テンプレートをレンダリングするためにコンテキストに入る必要があるものがわかりませんでした。

私も get_form をいじってみましたが、ModelAdmin はまだフォームに同じフィールドがあることを期待しています。

これらのいずれかが正しい方向に向かっていますか? 誰かが私が何をする必要があるか知っていますか?

4

2 に答える 2

0

ModelAdmin のフォーム属性を独自のフォーム クラスに設定することで、管理フォームをオーバーライドできます。

例: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form

class PersonForm(forms.ModelForm):

    class Meta:
        model = Person
        exclude = ['name']

class PersonAdmin(admin.ModelAdmin):
    exclude = ['age']
    form = PersonForm
于 2013-02-04T17:03:03.710 に答える
0

最終的にうまくいったのは、明示的にインスタンス化したい特定のフィールドを持つ通常のフォーム (モデルフォームではない) を作成することでした。

次に、ModelAdmin.add_view を django.contrib.admin.options から ModelAdmin にコピーし、そのコピーを大規模にハッキングしました。そこにあるコードの半分はインライン用であるため、残りの半分は保存に関するものです。必要ありませんでした。

残りの部分で、少なくともフィールドセット、readonly_fields、フォーム、およびタイトルを探して置き換えます。

最後に、get_urls を使用して追加 URL を新しいビューにリダイレクトしました。

このアプローチの良い点は、少しリファクタリングするだけで、管理画面のどこにでも一般的な入力フォームをポップできることです。

Grappelli のちょっとしたことですが、オートコンプリートと関連するルックアップを行うには、オブジェクトに autocomplete_lookup_fields および/または related_lookup_fields を指定し、そのオブジェクトを model_admin として helpers.AdminForm に渡す必要があります。通常、これは ModelAdmin になりますが、そうではないようです。オブジェクトが実際に何であるかを気にするので、それらをフォームに配置して渡しました。

于 2013-02-06T11:06:58.407 に答える