Saya memiliki Person
model yang memiliki hubungan kunci asing Book
, yang memiliki sejumlah bidang, tapi saya paling khawatir tentang author
(standar CharField).
Dengan itu, dalam PersonAdmin
model saya , saya ingin menampilkan book.author
menggunakan list_display
:
class PersonAdmin(admin.ModelAdmin):
list_display = ['book.author',]
Saya sudah mencoba semua metode yang jelas untuk melakukannya, tetapi sepertinya tidak ada yang berhasil.
Ada saran?
get_author
, karena itu adalah apa yang Anda mengembalikan string (dan deskripsi singkat) sebenarnya? Atau ubah argumen format string keobj.book.reviews
?author = ForeignKey(Author)
model buku saja, lalulist_display = ('author')
?select_related
. yangget_queryset()
dariUserAdmin
harus ditimpa.Terlepas dari semua jawaban hebat di atas dan karena saya baru mengenal Django, saya masih terjebak. Inilah penjelasan saya dari sudut pandang pemula.
models.py
admin.py (Cara Salah) - Anda pikir itu akan berhasil dengan menggunakan 'model__field' untuk referensi, tetapi tidak
admin.py (Cara yang Benar) - ini adalah bagaimana Anda mereferensikan nama kunci asing dengan cara Django
Untuk referensi tambahan, lihat tautan model Django di sini
sumber
obj
adalahBookAdmin
?Seperti yang lainnya, saya juga membawa perlengkapan telepon. Tetapi mereka memiliki satu kelemahan: secara default, Anda tidak dapat memesannya. Untungnya, ada solusi untuk itu:
Django> = 1.8
Django <1.8
sumber
def author(self, obj):
Harap dicatat bahwa menambahkan
get_author
fungsi akan memperlambat list_display di admin, karena menunjukkan setiap orang akan membuat query SQL.Untuk menghindari ini, Anda perlu memodifikasi
get_queryset
metode di PersonAdmin, misalnya:sumber
__str__
rute, cukup tambahkan foreignkey kelist_display
danlist_select_related
Menurut dokumentasi, Anda hanya dapat menampilkan
__unicode__
representasi ForeignKey:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#list-display
Tampaknya aneh bahwa itu tidak mendukung
'book__author'
format gaya yang digunakan di tempat lain di DB API.Ternyata ada tiket untuk fitur ini , yang ditandai sebagai Won't Fix.
sumber
Saya baru saja memposting cuplikan yang membuat admin.ModelAdmin mendukung sintaks '__':
http://djangosnippets.org/snippets/2887/
Jadi kamu bisa melakukan:
Ini pada dasarnya hanya melakukan hal yang sama yang dijelaskan dalam jawaban lain, tetapi secara otomatis menangani (1) pengaturan admin_order_field (2) pengaturan short_description dan (3) memodifikasi queryset untuk menghindari hit database untuk setiap baris.
sumber
AttributeError: type object 'BaseModel' has no attribute '__metaclass__'
Anda dapat menunjukkan apa pun yang Anda inginkan di tampilan daftar dengan menggunakan panggilan. Akan terlihat seperti ini:
sumber
Yang ini sudah diterima, tetapi jika ada boneka lain di luar sana (seperti saya) yang tidak langsung mendapatkannya dari jawaban yang diterima saat ini , berikut ini sedikit lebih detail.
Kelas model dirujuk oleh
ForeignKey
kebutuhan untuk memiliki__unicode__
metode di dalamnya, seperti di sini:Itu membuat perbedaan bagi saya, dan harus diterapkan pada skenario di atas. Ini berfungsi pada Django 1.0.2.
sumber
def __str__(self):
.Jika Anda memiliki banyak bidang atribut relasi untuk digunakan
list_display
dan tidak ingin membuat fungsi (dan atributnya) untuk masing-masingnya, solusi yang sederhana akan mengesampingkan metodeModelAdmin
instace__getattr__
, membuat callable dengan cepat:Seperti intinya di sini
Atribut utama yang dapat dipanggil seperti
boolean
danshort_description
harus didefinisikan sebagaiModelAdmin
atribut, misalnyabook__author_verbose_name = 'Author name'
dancategory__is_new_boolean = True
.admin_order_field
Atribut callable didefinisikan secara otomatis.Jangan lupa untuk menggunakan atribut list_select_related di Anda
ModelAdmin
untuk membuat Django menghindari pertanyaan tambahan.sumber
Ada paket yang sangat mudah digunakan yang tersedia di PyPI yang menangani persis itu: Django-related-admin . Anda juga dapat melihat kode di GitHub .
Dengan ini, apa yang ingin Anda capai adalah sesederhana:
Kedua tautan berisi perincian lengkap tentang pemasangan dan penggunaan, jadi saya tidak akan menempelkannya di sini jika terjadi perubahan.
Hanya sebagai catatan, jika Anda telah menggunakan sesuatu selain
model.Admin
(misalnya saya menggunakanSimpleHistoryAdmin
gantinya), Anda dapat melakukan ini:class MyAdmin(SimpleHistoryAdmin, RelatedFieldAdmin)
.sumber
jika Anda mencobanya di Inline, Anda tidak akan berhasil kecuali:
di inline Anda:
dalam model Anda (MyModel):
sumber
Jawaban AlexRobbins bekerja untuk saya, kecuali bahwa dua baris pertama harus ada dalam model (mungkin ini diasumsikan?), Dan haruskah merujuk diri:
Kemudian bagian admin berfungsi dengan baik.
sumber
Saya lebih memilih ini:
sumber