Фильтрация списка пользователей с помощью поля UserProfile в Django Admin - PullRequest
5 голосов
/ 22 октября 2009

Я пытаюсь отфильтровать список пользователей в Django, используя поле UserProfile ... Мне нужно реализовать систему очередей, в которой новые пользователи помещаются в очередь до тех пор, пока администратор не утвердит их.

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

Очевидно, что list_display элементы могут быть вызываемыми, но list_filter не может, поэтому я могу перечислить, если пользователь находится в очереди без проблем, но администратору придется прокручивать весь список пользователей, чтобы определить, какие они находятся в очереди, что не имеет смысла ... Фильтрация только тех пользователей, которые находятся в очереди (с использованием userprofile.in_queue), была бы гораздо более практичной ...

Наконец, я подумал о добавлении настраиваемого представления в мою область администратора, в котором будет отображаться только пользователь в очереди, но это настраиваемое представление не отображается на странице индекса области администрирования, и о создании целого нового AdminSite только для новая опция фильтрации кажется немного излишней ...

Итак, в общем, чтобы подвести итог: могу ли я отфильтровать свой список пользователей на основе Поле UserProfile? Если нет, могу ли я добавить пользовательский вид, который доступен с первой страницы без необходимости создавать совершенно новый AdminSite только для этого?

Ответы [ 3 ]

3 голосов
/ 15 декабря 2011

Django 1.3 исправил это - list_filter теперь позволяет охватывать отношения:

https://docs.djangoproject.com/en/1.3/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter

1 голос
/ 23 октября 2009

Возможно, вы захотите взглянуть на использование собственного менеджера для 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 docs и выполнив поиск «пользовательских менеджеров».

0 голосов
/ 23 октября 2009

Мне кажется, что самый быстрый и простой вариант - добавить новое представление администратора в ваше приложение, специально для вашей пользовательской модели. Подробности смотрите в Django admin docs , хотя, похоже, вы уже знаете, как использовать Admin.

Когда страница администратора соответствует вашей модели, все ваши настраиваемые поля больше не будут внешними ключами. Это упростит фильтрацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...