Пользователь-группы Джанго в userAdmin, и группы-пользователи в Мыши groupadmin
Можно ли иметь виджет "многие ко многим" в админ-панели на вкладке "пользователь" для выбора групп, к которым принадлежит пользователь, и аналогичный виджет "многие ко многим" на вкладке "группа" для выбора пользователей, которые должны принадлежать к этой группе?
1 ответ:
Есть легкий путь и трудный путь.
Самый простой способ-использовать объекты Джанго
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)
Трудный путь требует, чтобы вы создали свою собственную форму, вручную загрузили и сохранили связанных пользователей:
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)