11

フィールドが読み取り専用のときに、django admin のフィールドにウィジェットを表示したいと考えています。

admin.py

class AudioTrackAdminInline(admin.StackedInline):
    model = AudioTrack
    form = AudioTrackForm
    readonly_fields = ('file',)

フォーム.py

class AudioTrackForm(forms.ModelForm):
    class Meta:
        model = AudioTrack
        widgets = { 'file': MediaFileInput, } # my widget

ファイルが読み取り専用でない場合、widget OK と表示されます。しかし、読み取り専用として含めると、テキスト行が表示されます。(読み取り専用の場合、Django は私のフォームを使用しません)

読み取り専用フィールドでもフォームを使用するにはどうすればよいですか?

また

フィールドを読み取り専用に設定した場合に別のウィジェットを表示するにはどうすればよいですか?

4

2 に答える 2

9

特徴と言えよう。

フィールドが読み取り専用に設定されている場合、Django はdisplay_for_field結果をハードコードする関数を使用するため、カスタマイズできません。

別のアプローチは、フィールドを readonly および override として設定せずformfield_for_dbfield、文書化されていないModelAdminメソッドであり、ニーズに応じて行動することです。

于 2013-02-12T13:24:50.743 に答える
8

get_form(...)別のより柔軟な解決策は、管理クラスのメソッドをオーバーライドして、読み取り専用モードでレンダリングするフィールドの「無効」属性を設定することです。

def get_form(self, *args, **kwargs):

    form = super(SupplierAdmin, self).get_form(*args, **kwargs)

    for field_name in self.fake_readonly_fields:
        form.base_fields[field_name].disabled = True

    return form

名前の重複を避けるために、通常の名前ではなく、名前self.readonly_fieldsを付けた別の配列から読み取り専用フィールドの名前を取得することに注意してください。self.fake_readonly_fields

提案されたソリューション ( を使用formfield_for_dbfield) の限界は、読み取り専用であるかどうかにかかわらず、特定のタイプのすべてのデータベース フィールドを同じ方法でレンダリングすることです。この方法は、フォーム全体が読み取り専用である必要がある場合に機能しますが、半分が読み取り専用で半分が読み取り専用でないフォームを扱う場合は、disabled属性に依存することをお勧めします。

ここでの私の答えの詳細:django modeladmin、readonly_fields、およびブール値フィールド

于 2014-03-28T14:11:34.810 に答える