2013-02-12 7 views
5

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

admin.py

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

forms.py

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

ファイルが読み取り専用でない場合は、ウィジェットOK表示されます。しかし、私はそれをreadonlyとして含めると、テキスト行が表示されます。 (Djangoは私のフォームを読み込み専用にしないでください)

どうすれば読み込み専用フィールドでもフォームを使うことができますか?私は読み取り専用私のフィールドを設定した場合、別のウィジェットを表示する方法

または

答えて

4

これは機能だと思います。

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

フィールドを読み取り専用に設定せず、formfield_for_dbfield、文書化されていないModelAdminメソッドをオーバーライドして、必要に応じて処理することもできます。

3

代わり、より柔軟なソリューションは、あなたの管理者クラスの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 

なお、私は(formfield_for_dbfieldを使用して)提案された解決策の限界がそのようにあなたがでレンダリングすることにある名前を避けるために

と重なって、ではない普通のself.readonly_fieldsからではなく、私はself.fake_readonly_fieldsという名前異なる配列から読み取り専用フィールドの名前を取ります同じ方法で、すべてのデータベースフィールドag指定されたタイプであれば、読み取り専用であるかどうかを確認してください。この方法は、フォーム全体を読み取り専用にする必要がある場合に機能しますが、半分の読み取り専用で半分のフォームしか扱わない場合は、disabled属性を使用する方がよいでしょう。ここに私の答えに

詳細は:すべてのウィジェットは `django.contrib.gis.formsで(HTML)属性(例をサポートしていませ以来django modeladmin, readonly_fields and boolean fields

+0

これは、' 'disabled' Field'属性を使用する必要があります。 fields.PointField')、それはユーザーによって変更することができます!したがって、 'form.base_fields [field_name] .disabled = True'を使用する必要があります。 – blueyed

関連する問題