Есть ли способ отфильтровать набор запросов в администраторе Django? - PullRequest
15 голосов
/ 31 октября 2009

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

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

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

Ответы [ 2 ]

25 голосов
/ 02 ноября 2009

Если вы используете 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-адреса (и, следовательно, делает для ваших пользователей совершенно очевидным, как просматривать объекты других людей).

25 голосов
/ 31 октября 2009

Это не задокументировано, но стандартное представление списка изменений принимает обычные параметры фильтра наборов запросов в качестве аргументов GET. Так что вы можете сделать:

/admin/myapp/bar/?user__username=foo
...