Есть ли способ отфильтровать запрос в администраторе django?

15 andrew [2009-10-31 00:02:00]

Я пытаюсь определить действие для модели Bar - но мне нужен только список объектов Bar, связанных с пользователем Foo.

Прежде чем я начну раскалываться в коде администратора и передавая пользовательский запрос (или создавая настраиваемое представление, которое захватывает поддержку multi-checkbox администратора), я решил, что проверю, есть ли способ, которым я мог бы срезать поэтому я получаю представление списка.

Примечание. Я не пытаюсь сортировать по соответствующему пользователю, и я не пытаюсь добавить дополнительные параметры в представление списка по умолчанию для фильтрации по пользователю; Мне нужен конкретный URL-адрес или представление, которое даст мне только список объектов Bar для определенного пользователя Foo.

django django-admin


2 ответа


25 Решение Daniel Roseman [2009-10-31 00:18:00]

Он не задокументирован, но в стандартном представлении списка изменений стандартные параметры параметров запроса задаются как аргументы GET. Итак, вы можете сделать:

/admin/myapp/bar/?user__username=foo

25 Josh Ourisman [2009-11-02 05:06:00]

Если вы используете 1.1.x, на самом деле очень легко передать пользовательский запрос. Все, что вам нужно сделать, это переопределить метод queryset() на вашем ModelAdmin. Что-то вроде этого:

class ThisAdmin(admin.ModelAdmin):
    def queryset(self, request):
        """
        Filter the objects displayed in the change_list to only
        display those for the currently signed in user.
        """
        qs = super(ThisAdmin, self).queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(owner=request.user)

Это действительно можно сделать и в ветке 1.0.x, но требует дополнительного кода в вашем ModelAdmin.

Преимущество такого подхода заключается в том, что он не загромождает ваши симпатичные URL-адреса админов (а также, следовательно, делает его чрезвычайно очевидным для ваших пользователей, как просматривать объекты других людей).