2011-03-22 22 views
84

Tôi tìm thấy tiện ích mặc định của Tiện ích Django là models.ManyToManyField để sử dụng. Đó là thành phần HTML select và nếu bạn có nhiều đối tượng của mô hình "khác" thì sẽ khá không thực tế khi tìm đối tượng "khác" mà bạn muốn liên kết với đối tượng "this". Và nếu bạn có rất nhiều đối tượng của mô hình "khác" thì dường như thậm chí còn làm chậm việc hiển thị trang Quản trị.Một Quản trị Django tốt hơn ManyToMany Field Widget

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 ManyToManyFields như tôi thấy phù hợp, nhưng có bất kỳ tiện ích nào được tạo sẵn mà tôi có thể sử dụng thay thế không? Trong giấc mơ của tôi, tôi hình dung một widget HTML nhập văn bản tự động hoàn thành. Điều này thậm chí còn thực tế/có thể làm trong khung quản trị Django?

Cảm ơn.

Trả lời

135

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

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

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

+0

Tuyệt vời! Điều này nghe có vẻ giống như những gì tôi đang tìm kiếm, tôi sẽ thử. –

+2

tuyệt vời, nó làm cho manytomany rõ ràng hơn rất nhiều để sử dụng – maazza

+0

của nó làm việc Nhưng làm thế nào để làm cho điều này đã được đọc chỉ đọc. Tôi đang thử đọc only_fields = ('users',). Nhưng nó được hiển thị trong một dòng riêng biệt bằng dấu phẩy. Tôi muốn thể hiện trong ngắt dòng ... –

6

bạn có thể thử sử dụng id thô trong quản trị viên. và django tài liệu: 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 cái gì đó với tính năng tự động hoàn tất, bạn có thể muốn xem xét điều này như là một điểm khởi đầu http://code.djangoproject.com/wiki/AutoCompleteSolutions

và cuối cùng là một ví dụ inline 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 đã tìm thấy this promising looking library được tham chiếu ở nơi khác.

Dường như tôi thực hiện 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 liên quan (bất kể có bao nhiêu!) Và hiển thị cho bạn một bộ chọn để chọn một vài trong số chúng, như filter_horizontal, nó hiển thị hộp tìm kiếm/bộ lọc và sử dụng các cuộc gọi lấy mẫu/tự động hoàn tất để truy xuất kết quả động. Điều này là rất tốt cho trường hợp bạn có thể có 5000 người dùng và muốn chọn 3 hoặc 4 người trong số họ mà không cần đợi các yếu tố 5k <option> tải xuống và hiển thị.

Các vấn đề liên quan