Django Admin - изменение типа пользователя (is_staff = T/F) на основе назначения группы

У меня есть приложение django с 3 типами пользователей, super_user, admin, user. Из панели django-admin я назначаю пользователя в группу Admin. Группа Admin - это группа с разрешенными правами. Поэтому, когда я назначаю пользователя, я меняю его is_staff на True в GroupAdminForm. Проблема в том, что когда я удаляю пользователя из группы, я не могу изменить значение параметра is_staff на false. Вот моя GroupAdminForm

Также я вижу, что save_m2m вызывается 2 раза, но я вызываю его один раз. каков здесь поток сохранения?

class GroupAdminForm(forms.ModelForm):
    class Meta:
        model = Group
        exclude = []

    users = forms.ModelMultipleChoiceField(
         queryset=User.objects.all(),
         required=False,
         widget=FilteredSelectMultiple('users', False)
    )

    def __init__(self, *args, **kwargs):
        super(GroupAdminForm, self).__init__(*args, **kwargs)
        old_users = None
        if self.instance.pk:
            self.fields['users'].initial = self.instance.user_set.all()
            old_users = self.instance.user_set.all()

    def save_m2m(self):
        print(f'Users = ', self.instance.user_set.all())
        print(f'M2M Called - {self.test}')
        self.instance.user_set.set(self.cleaned_data['users'])

    def save(self, *args, **kwargs):
        instance = super(GroupAdminForm, self).save()
        all_users = self.instance.user_set.all()
        print('Save Called')

        self.save_m2m()

        users = self.cleaned_data['users']
        if instance.name == 'Admin':
            for user in users:
                user.is_staff = True
                user.save()


        return instance


save_m2m вызывается 2 раза

<<<Метод

save() принимает необязательный аргумент ключевого слова commit, которое принимает значение True или False (по умолчанию True). Если вы вызываете save() с commit=True, ваш случай здесь:

instance = super(GroupAdminForm, self).save()

Django будет вызывать save_m2m() автоматически. Документация. Чтобы предотвратить это, используйте commit=False

 instance = super(GroupAdminForm, self).save(commit=False)

Проблема в том, что когда я удаляю пользователя из группы, я не могу изменить значение параметра is_staff на false

.

Используйте сигнал m2m_changed для обновления атрибута is_staff

Вернуться на верх