Admin Django: Bagaimana menampilkan sebuah field yang ditandai sebagai editable = False 'dalam model?

99

Meskipun sebuah field ditandai seperti 'editable=False'pada model, saya ingin halaman admin menampilkannya. Saat ini menyembunyikan bidang sama sekali .. Bagaimana ini bisa dicapai?

GabiMe
sumber

Jawaban:

195

Gunakan Bidang Hanya Baca . Seperti itu (untuk django> = 1.2):

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields=('first',)
tback
sumber
6
+1. Terutama jika Anda tidak berencana untuk mengedit bidang sama sekali di Admin.
Manoj Govindan
Ini tidak bekerja di sini (Django 2.0). Bidang tidak ditampilkan kemudian di antarmuka admin.
nerdoc
1
Saya baru saja membuat aplikasi contoh untuk mereproduksi kesalahan Anda (django 2.0.8, python 3.5). Ini masih berfungsi dengan baik. Mungkin ada hal lain yang salah di aplikasi Anda @nerdoc?
tback
Ups. Tembakan cepat tipikal. Tidak menguji, sepertinya ada masalah dengan instalasi saya. Terima kasih, dan maaf.
nerdoc
2
Bagi saya admin mengalami crash ketika saya menambahkannya ke fields, tetapi ketika saya menambahkannya ke readonly_fieldsdalamnya tidak muncul sampai saya menambahkannya ke keduanya dan kemudian muncul di admin.
owenfi
18

Memperbarui

Solusi ini berguna jika Anda ingin agar bidang tetap dapat diedit di Admin tetapi tidak dapat diedit di tempat lain. Jika Anda ingin menyimpan bidang non-diedit seluruh kemudian @Till Backhaus' jawabannya adalah pilihan yang lebih baik.

Jawaban Asli

Salah satu cara untuk melakukannya adalah dengan menggunakan custom ModelFormdi admin. Formulir ini dapat menimpa bidang wajib agar dapat diedit. Dengan demikian Anda mempertahankan di editable=Falsetempat lain selain Admin. Misalnya (diuji dengan 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)
Manoj Govindan
sumber
1
Ini tidak bekerja, setidaknya pada django 1.6. Formulir ditampilkan dengan benar di panel admin, tetapi ketika saya menyimpan formulir dan mengembalikannya lagi, nilai formulir menjadi default lagi.
Euphorbium
4

Bidang hanya baca Anda harus juga ada di bidang:

fields = ['title', 'author', 'content', 'published_date', 'updated_date', 'created_date']
readonly_fields = ('published_date', 'updated_date', 'created_date')
gabriel
sumber