簡體   English   中英

django1.8過濾器基於登錄的list_filter

[英]django1.8 filter list_filter based on login

在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

關注文檔並在此處找到答案: [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,)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM