在Django admin中编辑Group-object时将用户对象分配给组

Jan*_*nne 6 membership django usergroups django-admin

在用户对象(编辑用户)的默认Django管理视图中,可以编辑用户的组成员资格.如果我还想反过来怎么办?即,在组编辑页面中,可以选择属于正在编辑的组的用户.

正如我所看到的,Django没有从Group到User对象的ManyToMany映射,因此无法(?)为此特定情况实现ModelAdmin类.如果我可以创建一个额外的UsersOfGroup模型类并在Django的Group模型的ManyToMany字段中将其用作直通属性,那么可能有一种方法.

任何想法,这是否可以使用ModelAdmin技巧实现,或者我只需要为编辑组创建自定义视图?

我已经检查了这两个问题,但他们并没有做同样的事情:

在admin中添加用户时分配组

在admin中显示组成员身份

更新: 克里斯的答案几乎就在那里.:)该组具有对用户集的引用,但它被称为user_set,而不是用户.所以这些是我所做的改变:

if self.instance and self.instance.pk:
    self.fields['users'].initial = self.instance.user_set.all()
Run Code Online (Sandbox Code Playgroud)

if group.pk:
    group.user_set = self.cleaned_data['users']
Run Code Online (Sandbox Code Playgroud)

Chr*_*att 3

你的应用程序/admin.py

from django import forms
from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
from django.contrib.admin.widgets import FilteredSelectMultiple

from django.contrib.auth.models import User, Group

class GroupAdminForm(forms.ModelForm):
    users = forms.ModelMultipleChoiceField(
        queryset=User.objects.all(), 
        required=False,
        widget=FilteredSelectMultiple(
            verbose_name=_('Users'),
            is_stacked=False
        )
    )

    class Meta:
        model = Group

    def __init__(self, *args, **kwargs):
        super(GroupAdminForm, self).__init__(*args, **kwargs)

        if self.instance and self.instance.pk:
            self.fields['users'].initial = self.instance.users.all()

    def save(self, commit=True):
        group = super(GroupAdminForm, self).save(commit=False)

        if commit:
            group.save()

        if group.pk:
            group.users = self.cleaned_data['users']
            self.save_m2m()

        return group

class GroupAdmin(admin.ModelAdmin):
    form = GroupAdminForm

admin.site.unregister(Group)
admin.site.register(Group, GroupAdmin)
Run Code Online (Sandbox Code Playgroud)