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?
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