【问题标题】:Show group members in Django Admin在 Django Admin 中显示组成员
【发布时间】:2016-04-06 17:13:14
【问题描述】:

是否可以设置Django Admin 页面来显示哪个用户属于哪个组?是否可以使用Django Admin 页面将用户添加到组中?如果是,怎么做?

现在,我以编程方式将客户添加到 customers group 和卖家 sellers group,但在我的管理中看不到任何信息。

这是我的注册view

def register_customer(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        customer_registration_form = forms.CustomerRegistrationForm(request.POST)

        if form.is_valid() and customer_registration_form.is_valid():
            new_user = form.save()
            new_customer_profile = UserCustomerProfile(user=new_user)

            new_customer_profile.save()
            customers_group = Group.objects.get(name='Customers')
            new_user.groups.add(customers_group)

            return render(request, 'registration/complete.html')
        else:
            #handle errors

    customer_registration_form = forms.CustomerRegistrationForm()
    form = UserCreationForm()
    return render(request, "registration/register.html",
                  {'form': form, 'customer_registration_form': customer_registration_form})

【问题讨论】:

    标签: python django django-models django-admin django-permissions


    【解决方案1】:

    CVi 的回答进行了一些小的调整,但对于我的用例,我真的想要另一个多选小部件来管理组中的用户,就像用于管理组权限的多选一样。

    使用this answer 获得灵感,我想出了这个:

    from django import forms
    from django.contrib import admin
    from django.contrib.auth.admin import GroupAdmin as origGroupAdmin
    from django.contrib.auth.models import Group, User
    
    
    class GroupAdminForm(forms.ModelForm):
        """
        ModelForm that adds an additional multiple select field for managing
        the users in the group.
        """
        users = forms.ModelMultipleChoiceField(
            User.objects.all(),
            widget=admin.widgets.FilteredSelectMultiple('Users', False),
            required=False,
            )
    
    
        def __init__(self, *args, **kwargs):
            super(GroupAdminForm, self).__init__(*args, **kwargs)
            if self.instance.pk:
                initial_users = self.instance.user_set.values_list('pk', flat=True)
                self.initial['users'] = initial_users
    
    
        def save(self, *args, **kwargs):
            kwargs['commit'] = True
            return super(GroupAdminForm, self).save(*args, **kwargs)
    
    
        def save_m2m(self):
            self.instance.user_set.clear()
            self.instance.user_set.add(*self.cleaned_data['users'])
    
    
    class GroupAdmin(origGroupAdmin):
        """
        Customized GroupAdmin class that uses the customized form to allow
        management of users within a group.
        """
        form = GroupAdminForm
    
    
    # Register the modified GroupAdmin with the admin site
    admin_site = admin.AdminSite(name='my_admin')
    admin_site.register(Group, GroupAdmin)
    

    【讨论】:

    • 谢谢,这正是我需要的。
    • 爱爱爱,当有人为我工作时!我得到了“已经注册:模型组已经注册”,所以只需要添加 admin.site.unregister(Group) 因为我已经有一个管理站点,我将 origGroupAdmin 重命名为 DjangoGroupAdmin 只是为了坚持大写类约定。非常感谢!
    【解决方案2】:

    我不确定这是否是您要查找的内容,但您可以像这样(您的应用程序的 admin.py)对 Group 的 ModelAdmin 进行修改:

    from django.contrib.auth.admin import GroupAdmin
    from django.contrib.auth.models import Group
    admin.site.unregister(Group)
    
    
    class UserInLine(admin.TabularInline):
        model = Group.user_set.through
        extra = 0
    
    
    @admin.register(Group)
    class GenericGroup(GroupAdmin):
        inlines = [UserInLine]
    

    Code based on this answer

    现在您可以根据需要编辑内联。

    我不认为这正是您正在寻找的,但它是一种快速而肮脏的修复方法,可以完成工作。

    免责声明:我不知道这是否是被认可的 Django 做事方式,但我相信它不会太远。

    【讨论】:

    • 对于 Django 1.8,我需要使用 model = User.groups.through,因为 through 不是 Group.user_set 的属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    相关资源
    最近更新 更多