ผู้ดูแลระบบ Django ที่ดีกว่า ManyToMany Field Widget


102

ฉันพบว่าmodels.ManyToManyFieldวิดเจ็ตเริ่มต้นของ Django Admin นั้นยุ่งยากในการใช้งาน เป็นองค์ประกอบเลือก HTMLและหากคุณมี Objects ของโมเดล "อื่น" จำนวนมากแสดงว่าเป็นไปไม่ได้เลยที่จะหาวัตถุ "อื่น" ที่คุณต้องการเชื่อมโยงกับวัตถุ "นี้" และหากคุณมีออบเจ็กต์ของโมเดล "อื่น" จำนวนมากดูเหมือนว่าจะทำให้การแสดงผลหน้าผู้ดูแลระบบช้าลงด้วยซ้ำ

ฉันทราบว่าฉันสามารถสร้างวิดเจ็ตผู้ดูแลระบบที่กำหนดเองและใช้กับวิดเจ็ตของฉันได้ManyToManyFieldsตามที่เห็นสมควร แต่มีสิ่งใดบ้างที่ฉันสามารถใช้แทนได้ ในความฝันของฉันฉันนึกภาพวิดเจ็ต HTML ป้อนข้อความอัตโนมัติ สิ่งนี้สามารถทำได้จริง / ทำได้ในกรอบการดูแลระบบ Django หรือไม่?

ขอบคุณ.

คำตอบ:


161

ลองใช้filter_horizontalแอตทริบิวต์ในคลาสผู้ดูแลระบบของคุณเช่น:

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

ตามที่กล่าวไว้ในเอกสารประกอบ "การเพิ่ม ManyToManyField ในรายการนี้จะใช้อินเทอร์เฟซ" ตัวกรอง "JavaScript ที่ไม่สร้างความรำคาญซึ่งช่วยให้สามารถค้นหาภายในตัวเลือก" ได้ filter_verticalทำสิ่งเดียวกันกับเค้าโครงที่แตกต่างกันเล็กน้อย


เยี่ยมมาก! ดูเหมือนว่าสิ่งที่ฉันกำลังมองหาฉันจะลองดู
Chris W.

มันใช้งานได้ แต่จะทำอย่างไรให้ไฟล์นี้เป็นแบบอ่านอย่างเดียว ฉันพยายามอ่าน only_fields = ('users',) แต่แสดงเป็นบรรทัดเดียวคั่นด้วยลูกน้ำ ฉันต้องการแสดงในการแบ่งบรรทัด ...
Varnan K

ฉันกังวลว่าจะต้องเขียนวิดเจ็ตของตัวเอง แต่มันสมบูรณ์แบบ! ขอบคุณสำหรับสิ่งนั้น! ; P
umat

7

คุณสามารถลองใช้รหัสดิบในผู้ดูแลระบบ และเอกสาร django: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields

หากคุณกำลังมองหาบางสิ่งที่มีการเติมข้อความอัตโนมัติคุณอาจต้องการดูสิ่งนี้เป็นจุดเริ่มต้นhttp://code.djangoproject.com/wiki/AutoCompleteSolutions

และในที่สุดตัวอย่างอินไลน์ที่เรียบง่ายมาก:

Models.py

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

admin.py:

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

3

ฉันไม่ได้เล่นด้วยจริง ๆ แต่ฉันพบว่าห้องสมุดที่ดูมีแนวโน้มนี้อ้างอิงจากที่อื่น

ดูเหมือนว่าจะทำในสิ่งที่ฉันต้องการ แทนที่จะโหลดรายการออบเจ็กต์ที่เกี่ยวข้องทั้งหมด (ไม่ว่าจะมีกี่ชิ้นก็ตาม!) และนำเสนอตัวเลือกให้คุณเลือกไม่กี่รายการเช่นเดียวกับที่filter_horizontalแสดงกล่องค้นหา / ตัวกรองและใช้การเรียก typeahead / การเติมข้อความอัตโนมัติเพื่อดึงผลลัพธ์ แบบไดนามิก นี่เป็นสิ่งที่ดีสำหรับกรณีที่คุณอาจมีผู้ใช้ 5,000 คนและต้องการเลือก 3 หรือ 4 คนโดยไม่ต้องรอ<option>ให้ดาวน์โหลดและแสดงผลองค์ประกอบ5k


0

นี่เป็นคำถามเก่า แต่ฉันต้องการเพิ่มคำตอบที่นี่สำหรับผู้ที่พบสิ่งนี้เช่นเดียวกับฉัน: สถานการณ์นี้เป็นสิ่งที่ผู้ดูแลระบบอินไลน์ของ Django มีไว้สำหรับ โดยเฉพาะฉันใช้ TabularInlines กับฟิลด์รหัสดิบสำหรับความสัมพันธ์แบบกลุ่มต่อกลุ่มที่มีตัวเลือกมากเกินไป

https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#django.contrib.admin.TabularInline

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.