Bagaimana saya bisa membuat lebih dari satu ModelAdmin untuk model yang sama, masing-masing disesuaikan secara berbeda dan ditautkan ke URL yang berbeda?
Katakanlah saya memiliki model Django yang disebut Posting. Secara default, tampilan admin model ini akan mencantumkan semua objek Posting.
Saya tahu saya dapat mengkustomisasi daftar objek yang ditampilkan pada halaman dalam berbagai cara dengan mengatur variabel seperti list_display atau mengganti queryset
metode dalam ModelAdmin saya seperti:
class MyPostAdmin(admin.ModelAdmin):
list_display = ('title', 'pub_date')
def queryset(self, request):
request_user = request.user
return Post.objects.filter(author=request_user)
admin.site.register(MyPostAdmin, Post)
Secara default, ini dapat diakses di URL /admin/myapp/post
. Namun saya ingin memiliki beberapa tampilan / ModelAdmins dari model yang sama. misalnya /admin/myapp/post
akan mendaftar semua objek posting, dan /admin/myapp/myposts
akan mendaftar semua posting milik pengguna, dan /admin/myapp/draftpost
mungkin daftar semua posting yang belum dipublikasikan. (Ini hanya contoh, kasus penggunaan saya yang sebenarnya lebih kompleks)
Anda tidak dapat mendaftarkan lebih dari satu ModelAdmin untuk model yang sama (ini menghasilkan AlreadyRegistered
pengecualian). Idealnya saya ingin mencapai ini tanpa meletakkan semuanya menjadi satu kelas ModelAdmin tunggal dan menulis fungsi 'url' saya sendiri untuk mengembalikan queryset yang berbeda tergantung pada URL.
Saya telah melihat sumber Django dan saya melihat fungsi-fungsi seperti ModelAdmin.changelist_view
itu bisa dimasukkan ke dalam urls.py saya, tetapi saya tidak yakin bagaimana cara kerjanya.
Pembaruan : Saya telah menemukan satu cara untuk melakukan apa yang saya inginkan (lihat di bawah), tetapi saya masih ingin mendengar cara lain untuk melakukan ini.
sumber
Jawaban Paul Stone benar-benar hebat! Sebagai tambahan, untuk Django 1.4.5 saya perlu mewarisi kelas khusus saya
admin.ModelAdmin
sumber