2009-10-30 26 views
15

Tôi đang cố gắng xác định một hành động cho một thanh mô hình - nhưng tôi chỉ muốn danh sách các đối tượng Bar liên quan đến người dùng Foo.Có cách nào để lọc một queryset trong quản trị django?

Trước khi tôi bắt đầu mút xung quanh trong mã quản trị và chuyển qua bộ truy vấn tùy chỉnh (hoặc viết chế độ xem tùy chỉnh chiếm đoạt hỗ trợ nhiều hộp kiểm của quản trị viên), tôi đã xác định xem có cách nào tôi có thể chia nhỏ dữ liệu như vậy để tôi có được chế độ xem danh sách.

Lưu ý: Tôi không cố gắng sắp xếp theo người dùng có liên quan và tôi không cố thêm các tùy chọn bổ sung vào chế độ xem danh sách mặc định để lọc theo người dùng; Tôi cần một URL hoặc chế độ xem cụ thể sẽ cung cấp cho tôi chỉ danh sách đối tượng Bar cho một số cụ thể người dùng Foo.

Trả lời

25

Nó không được ghi lại, nhưng chế độ xem danh sách thay đổi chuẩn chấp nhận tham số bộ lọc truy vấn thông thường dưới dạng đối số GET. Vì vậy, bạn có thể làm:

/admin/myapp/bar/?user__username=foo 
+0

Và danh sách các khả năng là ở đây: https://docs.djangoproject.com/en/dev/ref/models/querysets/#field-lookups – AJP

25

Nếu bạn đang sử dụng 1.1.x, thật sự rất dễ dàng để vượt qua trong bộ truy vấn tùy chỉnh. Tất cả những gì bạn cần làm là ghi đè lên phương thức queryset() trên ModelAdmin của bạn. Một cái gì đó như thế này:

class ThisAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     """ 
     Filter the objects displayed in the change_list to only 
     display those for the currently signed in user. 
     """ 
     qs = super(ThisAdmin, self).queryset(request) 
     if request.user.is_superuser: 
      return qs 
     return qs.filter(owner=request.user) 

Điều này thực sự có thể được thực hiện trong nhánh 1.0.x, nhưng yêu cầu thêm một chút mã trong ModelAdmin của bạn.

Ưu điểm của cách tiếp cận này là nó không làm lộn xộn các URL quản trị đẹp mắt của bạn (và do đó, làm cho người dùng của bạn vô cùng rõ ràng cách xem các đối tượng người khác).

+2

Điều này làm việc tốt cho các mô hình trực tiếp chỉnh sửa trên quản trị. Làm thế nào về các phím nước ngoài có được tự động dân cư trong thả xuống. –

+0

limit_choices_to = {} –

+2

'def queryset' là' def get_queryset' cho tất cả các phiên bản gần đây của Django. –

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