Một quản trị viên Django tốt hơn ManyToMany Field Widget


101

Tôi thấy models.ManyToManyFieldtiện ích mặc định của Quản trị viên Django hơi cồng kềnh khi sử dụng. Đó là phần tử chọn trong HTML và nếu bạn có nhiều Đối tượng của mô hình "kia" thì việc thực sự tìm thấy Đối tượng "khác" mà bạn muốn liên kết với Đối tượng "này" là khá phi thực tế. Và nếu bạn có nhiều đối tượng của mô hình "khác", nó dường như thậm chí còn làm chậm quá trình hiển thị của trang Quản trị.

Tôi biết rằng tôi có thể tạo tiện ích quản trị tùy chỉnh của riêng mình và áp dụng nó vào tiện ích của tôi ManyToManyFieldskhi tôi thấy phù hợp, nhưng có bất kỳ tiện ích được tạo sẵn nào ngoài đó mà tôi có thể sử dụng thay thế không? Trong giấc mơ của mình, tôi hình dung ra một widget HTML nhập văn bản tự động điền. Điều này thậm chí có thực tế / có thể thực hiện trong khuôn khổ quản trị Django không?

Cảm ơn.

Câu trả lời:


160

Hãy thử sử dụng filter_horizontalthuộc tính trên lớp quản trị của bạn, ví dụ:

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

Như đã đề cập trong tài liệu , "thêm ManyToManyField vào danh sách này thay vào đó sẽ sử dụng giao diện" bộ lọc "JavaScript không phô trương tiện lợi cho phép tìm kiếm trong các tùy chọn". filter_verticallàm điều tương tự với một bố cục hơi khác.


Tuyệt quá! Điều này có vẻ giống chính xác những gì tôi đang tìm kiếm, tôi sẽ thử.
Chris W.

Hoạt động của nó Nhưng làm thế nào để làm cho hồ sơ này chỉ được đọc. Tôi đang thử read only_fields = ('users',). Nhưng nó được hiển thị trong một dòng duy nhất được phân tách bằng dấu phẩy. Tôi muốn thể hiện trong ngắt dòng ...
Varnan K

Tôi đã lo lắng rằng tôi sẽ phải viết widget của riêng mình, nhưng điều này là hoàn hảo! Cảm ơn vì điều đó! ; P
umat

7

bạn có thể thử sử dụng một id thô trong quản trị viên. và tài liệu django: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields

nếu bạn đang tìm kiếm thứ gì đó có tính năng tự động hoàn thành, bạn có thể muốn xem điều này như một điểm khởi đầu http://code.djangoproject.com/wiki/AutoCompleteSolutions

và cuối cùng là một Ví dụ nội tuyến rất đơn giản:

models.py

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

admin.py:

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

3

Tôi chưa thực sự chơi với nó nhưng tôi thấy thư viện trông đầy hứa hẹn này được tham khảo ở những nơi khác.

Nó dường như làm chính xác những gì tôi muốn. Thay vì tải toàn bộ danh sách các đối tượng có liên quan (bất kể có bao nhiêu đối tượng!) Và hiển thị cho bạn một bộ chọn để chọn một vài trong số chúng, đồng thời filter_horizontal, nó trình bày một hộp tìm kiếm / bộ lọc và sử dụng lệnh gõ đầu trang / tự động hoàn thành để truy xuất kết quả động. Điều này rất tốt cho trường hợp bạn có khoảng 5000 người dùng và muốn chọn 3 hoặc 4 trong số họ mà không cần đợi 5k <option>phần tử tải xuống và hiển thị.


0

Đây là một câu hỏi cũ, nhưng tôi muốn thêm câu trả lời ở đây cho những người thấy điều này giống như tôi đã làm: tình huống này chính xác là những gì quản trị viên nội tuyến của Django. Cụ thể, tôi sử dụng TabularInlines với các trường id thô cho các quan hệ nhiều-nhiều có quá nhiều lựa chọn.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.