2010-04-11 26 views
5

Giả sử tôi có một trang web nơi Người dùng có thể thêm Mục nhập thông qua bảng quản trị. Mỗi Người dùng có Danh mục riêng của mình mà anh ta chịu trách nhiệm (mỗi Danh mục có một Trình biên tập được gán thông qua ForeingKey/ManyToManyField).Làm thế nào để lọc queryset trong changelist_view trong django admin?

Khi Người dùng thêm Entry sau cùng, tôi hạn chế sự lựa chọn bằng cách sử dụng EntryAdmin như thế này:

class EntryAdmin(admin.ModelAdmin): 
    (...) 

    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == 'category': 
      if request.user.is_superuser: 
       kwargs['queryset'] = Category.objects.all() 
      else: 
       kwargs['queryset'] = Category.objects.filter(editors=request.user) 
      return db_field.formfield(**kwargs) 
     return super(EntryAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

Bằng cách này tôi có thể giới hạn các loại mà một người dùng có thể thêm nhập và nó hoạt động hoàn hảo.

Bây giờ phần phức tạp: Trên trang Thay đổi/nhập hành động tôi muốn chỉ hiển thị những mục nhập thuộc Danh mục người dùng hiện tại. Tôi cố gắng để làm điều này sử dụng phương pháp này:

def changelist_view(self, request, extra_context=None): 
     if not request.user.is_superuser: 
      self.queryset = self.queryset.filter(editors=request.user) 

Nhưng tôi nhận được lỗi này:

AttributeError: 'function' object has no attribute 'filter'

Đây là kỳ lạ, bởi vì tôi nghĩ nó phải là một QuerySet điển hình. Về cơ bản các phương pháp như vậy là not well documented và đào qua tấn mã Django không phải là môn thể thao yêu thích của tôi.

Bất kỳ ý tưởng nào về cách tôi có thể đạt được mục tiêu của mình?

Trả lời

12

queryset là phương thức trên ModelAdmin trả về bộ truy vấn. Bạn cần ghi đè lên lớp học EntryAdmin của mình.

def queryset(self, request): 
    qs = super(EntryAdmin, self).queryset(request) 
    if request.user.is_superuser: 
     return qs 
    else: 
     return qs.filter(editors=request.user) 

Thay đổi bộ truy vấn sẽ giới hạn các mục nhập được hiển thị trong chế độ xem danh sách. Bạn cũng cần ghi đè has_change_permission để đảm bảo rằng người dùng có quyền chỉnh sửa đối tượng trên trang chỉnh sửa đối tượng riêng lẻ. Xem bài đăng trên blog sau đây của James Bennett để biết thêm chi tiết:

http://www.b-list.org/weblog/2008/dec/24/admin/

+0

QuerySet cần được lọc theo Danh mục. Nhưng có vấn đề khi Người dùng có nhiều Danh mục được chỉ định. Hoặc có lẽ tôi đang thiếu một cái gì đó. – minder

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