Django用户和组-在管理员中显示组成员身份?

3
Django管理界面的用户管理功能可以轻松地通过选择组列表来设置用户的组从属关系。这是默认的ManyToMany关系分配小部件。对于大多数情况下,这对于从一开始创建用户很有用。
然而,假设我有大量的用户和组,我想通过在管理员中单击组并查看类似的选择器(或通过水平小部件)中的所有成员来查看和管理组成员资格。
是否有内置的Django方法/技巧来“反向”显示ManyToMany关系?
在用户创建时,从用户管理表单中设置组分配是可以的。但是,一旦用户和组得到了很好的建立,找到和管理它可能会非常麻烦。
我想解决方法是制作自己的视图来显示组成员,我只是想看看是否有一些技巧可以在管理员中使用内联或其他东西。

https://dev59.com/IGw15IYBdhLWcg3wpNYB - utapyngo
1个回答

1
尝试使用这个片段。 这是contrib.auth应用程序管理部分的自定义示例。
# utils/admin_auth.py
# -*- coding: utf-8 -*-
from django.utils.safestring import mark_safe
from django.contrib.auth.models import User, Group
from django.contrib.auth.admin import UserAdmin, GroupAdmin
from django.contrib import admin

def roles(self):
    #short_name = unicode # function to get group name
    short_name = lambda x:unicode(x)[:1].upper() # first letter of a group
    p = sorted([u"<a title='%s'>%s</a>" % (x, short_name(x)) for x in self.groups.all()])
    if self.user_permissions.count(): p += ['+']
    value = ', '.join(p)
    return mark_safe("<nobr>%s</nobr>" % value)
roles.allow_tags = True
roles.short_description = u'Groups'

def last(self):
    fmt = "%b %d, %H:%M"
    #fmt = "%Y %b %d, %H:%M:%S"
    value = self.last_login.strftime(fmt)
    return mark_safe("<nobr>%s</nobr>" % value)
last.allow_tags = True
last.admin_order_field = 'last_login'

def adm(self):
    return self.is_superuser
adm.boolean = True
adm.admin_order_field = 'is_superuser'

def staff(self):
    return self.is_staff
staff.boolean = True
staff.admin_order_field = 'is_staff'

from django.core.urlresolvers import reverse
def persons(self):
    return ', '.join(['<a href="%s">%s</a>' % (reverse('admin:auth_user_change', args=(x.id,)), x.username) for x in self.user_set.all().order_by('username')])
persons.allow_tags = True

class UserAdmin(UserAdmin):
    list_display = ['username', 'email', 'first_name', 'last_name', 'is_active', staff, adm, roles, last]
    list_filter = ['groups', 'is_staff', 'is_superuser', 'is_active']

class GroupAdmin(GroupAdmin):
    list_display = ['name', persons]
    list_display_links = ['name']

admin.site.unregister(User)
admin.site.unregister(Group)
admin.site.register(User, UserAdmin)
admin.site.register(Group, GroupAdmin)

1
最好的做法是在这里发布回答问题所需的大部分或部分代码,然后再添加一个链接。这样可以防止链接的站点出现404错误时回答无效。 - tread

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接