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