简体   繁体   English

django1.8过滤器基于登录的list_filter

[英]django1.8 filter list_filter based on login

In django 1.8 how to you filter the list_filter based on logged in user? 在django 1.8中,如何根据登录用户过滤list_filter? I cannot use SimpleListFilter from django.contrib.admin as I use django.contrib.admin.apps.SimpleAdminConfig to register a view using AdminPlus. 我无法使用django.contrib.admin中的SimpleListFilter,因为我使用django.contrib.admin.apps.SimpleAdminConfig使用AdminPlus注册视图。

Some code that I tried in the ModelAdmin: 我在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

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

Sharing my answer: 分享我的答案:

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

In the modeladmin: 在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,)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM