django1.8过滤list_filter基于登录

时间:2015-12-11 11:37:01

标签: python django

在django 1.8中如何基于登录用户过滤list_filter?我不能使用django.contrib.admin中的SimpleListFilter,因为我使用django.contrib.admin.apps.SimpleAdminConfig使用AdminPlus注册视图。

我在ModelAdmin中尝试过的一些代码:

def get_list_filter(self, request):
    my_list_filter = super(SubCategoryAdmin, self).get_list_filter(request)
    if request.user.is_superuser:
        pass
    else:
        my_list_filter = self.get_queryset(request)

    return my_list_filter

def get_queryset(self, request):
    '''
    Superuser has all permissions.
    '''
    qs = super(SubCategoryAdmin, self).get_queryset(request)
    if request.user.is_superuser:
        pass
    else:
        qs = qs.filter(
            category__in=Category.objects.filter(
                department__in=Department.objects.filter(
                    name=request.user.customuser.department.name)))
    return qs

1 个答案:

答案 0 :(得分:-1)

关注文档并在此处找到答案:[https://docs.djangoproject.com/en/1.8/ref/contrib/admin/][1]

分享我的回答:

class UserCategoryListFilter(admin.SimpleListFilter):
    # Human-readable title which will be displayed in the
    # right admin sidebar just above the filter options.
    title = _('Department',)

    # Parameter for the filter that will be used in the URL query.
    parameter_name = 'department'

    def lookups(self, request, model_admin):
        """
        Returns a list of tuples. The first element in each
        tuple is the coded value for the option that will
        appear in the URL query. The second element is the
        human-readable name for the option that will appear
        in the right sidebar.
        """
        if not request.user.is_superuser:
            return (
                (request.user.customuser.department.name, _(request.user.customuser.department.name)),
        )

    def queryset(self, request, queryset):
        """
        Returns the filtered queryset based on the value
        provided in the query string and retrievable via
        `self.value()`.
        """
        # to decide how to filter the queryset.
        if request.user.is_superuser:
            if self.value() == request.user.customuser.department.name:
                return queryset.filter(
                    department__in=Department.objects.filter(
                        name=request.user.customuser.department.name))
        else:
            return queryset

在modeladmin:

class CategoryAdmin(admin.ModelAdmin):

    def changelist_view(self, request, extra_context=None):
        extra_context = extra_context or {}        

        if request.user.is_superuser:
            self.list_filter = ['department','name']
        else:
            self.list_filter = (UserCategoryListFilter,)