【问题标题】:Django Admin - change user type (is_staff = T/F) based on group assignmentDjango Admin - 根据组分配更改用户类型(is_staff = T/F)
【发布时间】:2021-12-28 21:12:24
【问题描述】:

我有一个包含 3 种用户类型的 django 应用程序,超级用户、管理员、用户。从 django-admin 面板中,我将一个用户分配给 Admin 组。管理员组是具有允许权限的组。因此,当我分配用户时,我在 GroupAdminForm 中将他们的 is_staff 更改为 True。问题是当我从组中删除用户时,我无法将这些用户 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


【问题讨论】:

  • 这三种用户类型/级别已经在带有布尔字段(is_superuser 和 is_staff)的内置用户模型上实现,为什么您需要或想要为此使用组?
  • 我需要为我的管理员类型用户分配不同的权限,并且我想将此用户称为管理员而不是员工。我无法将 is_staff 重命名为 is_admin 并保持相同的功能。 SuperUser 或 User 类型可以很好地与内置功能 @IainShelvington

标签: python-3.x django django-admin


【解决方案1】:

save_m2m 被调用了 2 次​​p>

save() 方法接受可选的 commit 关键字参数,该参数接受 TrueFalse(默认为 True) .如果您使用commit=True 调用save(),您的情况如下:

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

Django 会自动调用 save_m2m()Documentation 为了防止这种情况使用commit=False

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

问题是当我从组中删除用户时,我无法将这些用户 is_staff 更改为 false

使用m2m_changed 信号更新is_staff 属性

【讨论】:

  • 您好,谢谢。但是 m2m_changed 信号与模型一起使用,但在我的情况下,我使用的是自定义用户和组,所以我不确定如何使用 throufh 关系。
猜你喜欢
  • 1970-01-01
  • 2016-04-06
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 2011-06-02
  • 1970-01-01
相关资源
最近更新 更多