Django userAdmin中的用户到组,以及groupAdmin中的group-to-users

zie*_*ony 5 django django-admin

是否可以在用户选项卡的管理面板中包含多对多窗口小部件以选择用户所属的组,以及用于组选项卡中的类似多对多窗口小部件以选择应属于该组的用户?

aug*_*men 7

有简单的方法和艰难的方式.

简单的方法是使用Django的InlineModelAdmin对象.但是,这样您就无法使用组窗口小部件.

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

class UserSetInline(admin.TabularInline):
    model = User.groups.through
    raw_id_fields = ('user',)  # optional, if you have too many users

class MyGroupAdmin(GroupAdmin):
    inlines = [UserSetInline]

# unregister and register again
admin.site.unregister(Group)
admin.site.register(Group, MyGroupAdmin)
Run Code Online (Sandbox Code Playgroud)

困难的方法要求您构建自己的表单,手动加载并保存相关用户:

from django import forms
from django.contrib import admin
from django.contrib.auth.admin import GroupAdmin
from django.contrib.auth.models import User, Group

class GroupForm(forms.ModelForm):
    users = forms.ModelMultipleChoiceField(
        label='Users',
        queryset=User.objects.all(),
        required=False,
        widget=admin.widgets.FilteredSelectMultiple(
            "users", is_stacked=False))

    class Meta:
        model = Group
        widgets = {
            'permissions': admin.widgets.FilteredSelectMultiple(
                "permissions", is_stacked=False),
        }


class MyGroupAdmin(GroupAdmin):
    form = GroupForm

    def save_model(self, request, obj, form, change):
        # save first to obtain id
        super(GroupAdmin, self).save_model(request, obj, form, change)
        obj.user_set.clear()
        for user in form.cleaned_data['users']:
             obj.user_set.add(user)

    def get_form(self, request, obj=None, **kwargs):
        if obj:
            self.form.base_fields['users'].initial = [o.pk for o in obj.user_set.all()]
        else:
            self.form.base_fields['users'].initial = []
        return GroupForm

# unregister and register again
admin.site.unregister(Group)
admin.site.register(Group, MyGroupAdmin)
Run Code Online (Sandbox Code Playgroud)

  • 你不知道你保存了多少次屁股.:) 再次感谢. (3认同)
  • "艰难的方式"真是棒极了!对于Django> = 1.8,你只需要将`exclude =()`添加到`ModelForm:Meta:` - http://stackoverflow.com/questions/28306288/removedindjango18warning-creating-a-modelform-without-either-the-the -fields-attri/28306347 (2认同)