【问题标题】:Filter a User list using a UserProfile field in Django Admin使用 Django Admin 中的 UserProfile 字段过滤用户列表
【发布时间】:2010-12-09 05:12:17
【问题描述】:

我正在尝试使用 UserProfile 字段过滤 Django 中的用户列表...我需要实现一个队列系统,将新用户放入队列中,直到管理员批准他们。

我只是在我的 UserProfile 模型中添加了一个 is_in_queue 布尔字段...但是,当在我的管理区域中显示用户列表时,我意识到您无法使用模型的外键字段过滤列表(在此case, UserProfile 的一个字段)

显然,list_display 项目可以是可调用的,但 list_filter 不能,所以我可以列出如果用户在队列中没有问题,但管理员必须滚动整个用户列表才能发现哪个那些在队列中没有意义...仅过滤队列中的用户(使用 userprofile.in_queue)会更实用...

最后,我考虑向我的管理区域添加一个自定义视图,该视图将仅列出队列中的用户,但该自定义视图不会显示在管理区域索引页面上,并将一个全新的 AdminSite 组合在一起仅用于一个新的过滤选项似乎有点过头了......

所以基本上总结一下:我可以根据 用户配置文件字段?如果没有,我可以添加一个可访问的自定义视图吗 从首页,而无需创建一个全新的 AdminSite 只是为了那个?

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    Django 1.3 修复了这个问题 - list_filter 现在允许跨越关系:

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

    【讨论】:

      【解决方案2】:

      您可能想看看为您的模型的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 方法,您可以过滤结果。然后只需将其分配给您的User 模型的admin_objects 属性。

      admin_objects = UserAdminManager()
      

      我的示例中的某些属性名称可能是错误的,因为我不知道您的模型设置,但希望您能明白。

      您可以通过查看 django 文档并搜索“自定义管理器”来进一步研究。

      【讨论】:

        【解决方案3】:

        在我看来,最快和最简单的选择是为您的应用程序添加一个新的管理视图,特别是为您的自定义用户模型。有关详细信息,请参阅Django admin docs,尽管听起来您已经知道如何使用 Admin。

        一旦管理页面特定于您的模型,您的所有自定义字段将不再是外键。这将使过滤变得容易。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-11
          • 2014-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-25
          • 2017-01-31
          相关资源
          最近更新 更多