Assign User-objects To A Group While Editing Group-object In Django Admin
Answer :
The save method above won't work if you add a new group and simultaneously add users to the group. The problem is that the new group won't get saved (the admin uses commit=False) and won't have a primary key. Since the purpose of save_m2m() is to allow the calling view to handle saving m2m objects, I made a save object that wraps the old save_m2m method in a new method.
def save(self, commit=True): group = super(GroupAdminForm, self).save(commit=commit) if commit: group.user_set = self.cleaned_data['users'] else: old_save_m2m = self.save_m2m def new_save_m2m(): old_save_m2m() group.user_set = self.cleaned_data['users'] self.save_m2m = new_save_m2m return group
yourapp/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)
Comments
Post a Comment