Фильтрация списка пользователей с помощью поля UserProfile в Django Admin

StackOverflow https://stackoverflow.com/questions/1609241

  •  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 теперь позволяет охватывать отношения:

https: // docs .djangoproject.com / ен / 1,3 / исх / вно / администратор / # django.contrib.admin.ModelAdmin.list_filter

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top