Фильтрация фильтров в Django Admin - PullRequest
1 голос
/ 20 февраля 2011

Вот мой код для школьного проекта http://dpaste.com/434311/

Код работает нормально, на странице списка studentadmin я получаю фильтр для классов это хорошо, но, как вы можете видеть, мой проект является мультитенантным, поэтому в фильтре область, которую я хочу показать только классы для школы текущий пользователь вошли в систему (отслеживаются через сеансы), но сейчас я вижу список всех классы из всех школ

поэтому я хочу заменить эту строку

list_filter   = ['xclass']  

с чем-то вроде

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

как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 02 мая 2012

Начиная с версии 1.4, выпущенной 23 марта 2012 г., вы можете использовать официальный django.contrib.admin.SimpleListFilter

Вот пример кода фильтра, используемого только в этом списке активных компаний:

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())
1 голос
/ 20 февраля 2011

Я сталкивался с этой проблемой много раз. К сожалению, вам нужно написать нестандартное, недокументированное FilterSpec.

Пользовательский фильтр в Django Admin на Django 1.3 или ниже

Над этим работают, так что скоро должны быть здесь ...
http://code.djangoproject.com/ticket/5833


Альтернативой является изменение базы queryset для страницы списка только теми, которые указаны в вашем школьном идентификаторе. 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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...