Фильтрация списка пользователей с помощью поля UserProfile в Django Admin
-
05-07-2019 - |
Вопрос
Я пытаюсь отфильтровать список пользователей в Django, используя поле UserProfile ... Мне нужно реализовать систему очередей, в которой новые пользователи помещаются в очередь до тех пор, пока администратор не утвердит их.
Я просто добавил логическое поле is_in_queue
в свою модель UserProfile ... Однако при отображении списка пользователей в моей административной области я понял, что вы не можете фильтровать список, используя стороннюю модель. ключевое поле (в данном случае поле UserProfile)
Очевидно, элементы list_display
могут вызываться, но list_filter
не может, поэтому я могу перечислить, если пользователь находится в очереди без проблем, но администратор может прокручивать весь список пользователей, чтобы определить, какие из них находятся в очереди, что не имеет смысла ... Фильтрация только тех пользователей, которые находятся в очереди (с использованием userprofile.in_queue), была бы гораздо более практичной ...
Наконец, я подумал о добавлении настраиваемого представления в мою область администратора, в котором будет отображаться только пользователь в очереди, но это настраиваемое представление не отображается на странице индекса области администрирования, и о создании целого нового AdminSite только для новая опция фильтрации выглядит немного перегруженной ...
Итак, в общем, чтобы подвести итог: могу ли я отфильтровать свой список пользователей на основе Поле UserProfile? Если нет, могу ли я добавить пользовательский вид, который доступен с первой страницы без необходимости создавать совершенно новый AdminSite только для этого? Р>
Решение
Возможно, вы захотите взглянуть на использование собственного менеджера для admin_objects
вашей модели.
class UserAdminManager(models.AdminManager):
"""
Custom manager for the User model.
"""
def get_query_set(self):
"""
Overwrites the get_query_set to only return Users in the queue.
"""
return super(UserAdminManager, self).get_query_set().filter(userprofile__queue=True)
Перезаписав метод get_query_set
, вы можете отфильтровать результаты. Затем просто присвойте это свойству admin_objects
вашей модели User
.
admin_objects = UserAdminManager()
Некоторые имена свойств в моем примере могут быть неправильными, поскольку я не знаю, как настроена ваша модель, но, надеюсь, вы поняли идею.
Вы можете исследовать этот вопрос подробнее, ознакомившись с документацией по django и выполнив поиск «пользовательских менеджеров».
Другие советы
Django 1.3 исправил это - list_filter теперь позволяет охватывать отношения:
Мне кажется, что самый быстрый и простой вариант - добавить новое представление администратора в ваше приложение, специально для вашей пользовательской модели. Подробности смотрите в документации администратора Django . Похоже, вы уже знаете, как использовать Admin.
Когда страница администратора соответствует вашей модели, все ваши настраиваемые поля больше не будут внешними ключами. Это упростит фильтрацию.