Widget Bidang Banyak Django Admin Lebih Baik


101

Saya menemukan default Django Admin models.ManyToManyFieldwidget menjadi rumit untuk digunakan. Ini adalah elemen pemilihan HTML dan jika Anda memiliki banyak Objek dengan model "lainnya" maka tidak praktis untuk benar-benar menemukan Objek "lain" yang ingin Anda kaitkan dengan Objek "ini". Dan jika Anda memiliki banyak objek dari model "lainnya", ini tampaknya memperlambat rendering halaman Admin.

Saya sadar bahwa saya dapat membuat widget admin kustom saya sendiri dan menerapkannya ke widget ManyToManyFieldssaya sesuai keinginan saya, tetapi adakah yang sudah dibuat sebelumnya yang mungkin saya gunakan? Dalam mimpi saya, saya membayangkan widget HTML input teks yang dilengkapi otomatis. Apakah ini praktis / mungkin dilakukan dalam kerangka admin Django?

Terima kasih.

Jawaban:


160

Coba gunakan filter_horizontalatribut di kelas admin Anda, misalnya:

class SomeModelAdmin(admin.ModelAdmin):
    filter_horizontal = ('users',)

Seperti yang disebutkan dalam dokumentasi , "menambahkan ManyToManyField ke daftar ini akan menggunakan antarmuka" filter "JavaScript bagus yang tidak mengganggu yang memungkinkan pencarian di dalam opsi". filter_verticalmelakukan hal yang sama dengan tata letak yang sedikit berbeda.


Bagus! Kedengarannya persis seperti yang saya cari, saya akan mencobanya.
Chris W.

Ini Bekerja Tetapi bagaimana membuat ini diajukan hanya untuk dibaca. Saya mencoba read only_fields = ('users',). Tapi itu ditampilkan dalam satu baris dipisahkan dengan koma. Saya ingin ditampilkan dalam baris baru ...
Varnan K

Saya khawatir saya harus menulis widget saya sendiri, tetapi ini sempurna! Terima kasih untuk itu! ; P
umat

7

Anda dapat mencoba menggunakan id mentah di admin. dan dokumen django: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields

jika Anda mencari sesuatu dengan pelengkapan otomatis, Anda mungkin ingin melihatnya sebagai titik awal http://code.djangoproject.com/wiki/AutoCompleteSolutions

dan terakhir Contoh sebaris yang sangat sederhana:

models.py

class SomeModel(models.Model):
    users = models.ManyToMany(User)

admin.py:

class SomeModelAdmin(admin.ModelAdmin):
    raw_id_fields = ("users",)

3

Saya belum benar-benar bermain dengannya tetapi saya menemukan perpustakaan yang tampak menjanjikan ini direferensikan di tempat lain.

Tampaknya melakukan apa yang saya inginkan. Alih-alih memuat seluruh daftar objek terkait (terlepas dari berapa banyak yang ada!) Dan memberi Anda alat pilih untuk memilih beberapa di antaranya, seperti filter_horizontalhalnya, ini menyajikan kotak pencarian / filter dan menggunakan panggilan typeahead / autocomplete untuk mengambil hasil secara dinamis. Ini bagus untuk kasus di mana Anda mungkin memiliki 5.000 pengguna dan ingin memilih 3 atau 4 di antaranya tanpa menunggu 5k <option>elemen untuk diunduh dan dirender.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.