Django管理者:モデルでeditable = False 'とマークされたフィールドを表示する方法は?


98

'editable=False'モデルのようにフィールドがマークされていても、管理ページに表示させたい。現在、フィールドは完全に非表示になっています。これはどのようにして実現できますか?

回答:


194

読み取り専用フィールドを使用します。そうです(django> = 1.2の場合):

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields=('first',)

6
+1。特に、Adminでフィールドを編集する予定がない場合。
Manoj Govindan、

これはここでは機能しません(Django 2.0)。その場合、フィールドは管理インターフェースに表示されません。
nerdoc 2018

1
エラーを再現するためのサンプルアプリケーションを作成しました(django 2.0.8、python 3.5)。これはまだ正常に動作します。たぶんあなたのアプリ@nerdocで何か他のことが間違っていますか?
-tback

おっと。典型的なファストショット。テストしなかった、私のインストールに問題があるようだ。ありがとう、ごめんなさい。
nerdoc

2
私にとっては、に追加したときに管理者がクラッシュしましたがfields、追加したときにreadonly_fields両方に追加してから管理者に表示されるまで表示されませんでした。
owenfi 2018

18

更新

このソリューションは、フィールドをAdminで編集可能にしたいが、他の場所では編集できないようにする場合に役立ちます。フィールド全体を編集できないようにしたい場合は、@ Till Backhausの答えがより良いオプションです。

元の回答

これを行う1つの方法はModelForm、管理でカスタムを使用することです。このフォームは、必須フィールドをオーバーライドして編集可能にすることができます。これによりeditable=False、管理者以外のすべての場所に保持されます。たとえば(Django 1.2.3でテスト済み)

# models.py
class FooModel(models.Model):
    first = models.CharField(max_length = 255, editable = False)
    second  = models.CharField(max_length = 255)

    def __unicode__(self):
        return "{0} {1}".format(self.first, self.second)

# admin.py
class CustomFooForm(forms.ModelForm):
    first = forms.CharField()

    class Meta:
        model = FooModel
        fields = ('second',)

class FooAdmin(admin.ModelAdmin):
    form = CustomFooForm

admin.site.register(FooModel, FooAdmin)

1
これは少なくともdjango 1.6では機能しません。フォームは管理パネルに正しく表示されますが、フォームを保存して再びフォームに戻ると、フォームの値はデフォルトに戻ります。
ユーフォ

4

読み取り専用フィールドもフィールドに含まれている必要があります。

fields = ['title', 'author', 'content', 'published_date', 'updated_date', 'created_date']
readonly_fields = ('published_date', 'updated_date', 'created_date')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.