开发者

Filtering the filters in Django Admin

Here is my code for a school project http://dpaste.com/434311/

The code works fine, on studentadmin list page, I get filter for classes which is good but as you can see my project is multi-tenant so in filter area I want to show only the classes for the school the current user is logged in (tracked thru sessions) but right now I can see list of all classes from all schools

so I want to replace this line

list_filter   = ['xclass']  

with something开发者_运维知识库 like

list_filter   = Class.objects.filter(school=request.session['school_id'])

how can I do it ?


As of version 1.4 released March 23, 2012 you can use the official django.contrib.admin.SimpleListFilter

Here is an example of filter code used to that list active company only:

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

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

    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.
        """
        lookup_list = Company.objects.active().values_list('id', 'name').distinct()
        # 'objects.active' is a custom Company manager and is 
        # equivalent to filter 'objects.filter(status=100)'  
        return lookup_list

    def queryset(self, request, queryset):
        """
        Returns the filtered queryset based on the value
        provided in the query string and retrievable via
        `self.value()`.
        """
        # Compare the requested value (either '80s' or 'other')
        # to decide how to filter the queryset.
        if self.value():
            return queryset.filter(project__company=self.value())


I've run into this issue many times. Unfortunately, you are going to need to write a custom, undocumented FilterSpec.

Custom Filter in Django Admin on Django 1.3 or below

It's being worked on so should be here soon...
http://code.djangoproject.com/ticket/5833


An alternative is to modify the base queryset for the list page with only those from your school id. http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.queryset

def queryset(self, request):
    qs = super(MyModelAdmin, self).queryset(request)
    return qs.filter(xclass__school__id=request.session['school_id'])
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜