在Django中更改is_superuser字段

0 投票
1 回答
575 浏览
提问于 2025-04-21 01:44

我有一个表格,里面有一些叫做“审核者”的用户,这些用户都是普通的Django auth_users,他们可能是超级用户,也可能不是。这个信息是通过 is_superuser 这个字段来表示的(来自 django.contrib.auth

我写了一个函数,用来改变每个通过复选框选中的审核者的超级用户状态:

def change_su(request):

    if request.method == 'POST':
        ids = request.POST.getlist('selected')

        for id in ids:
            try:
                rev = Reviewer.objects.get(pk=id)
                if rev.is_superuser == 1:
                    rev.is_superuser = 0
                    messages.info(request, _('User with id %(id)s is no superuser anymore') % {'id': id})
                else:
                    rev.is_superuser = 1
                    messages.info(request, _('User with id %(id)s is now superuser') % {'id': id})

            except Exception as e:
                logging.getLogger(__name__).exception(e)
                messages.error(request, _('Failed to change superuser status for reviewer with id %(id)s') % {'id': id})

 return HttpResponseRedirect(reverse('admin_index'))

当我选择一个用户并点击调用这个函数的按钮时,它会显示“用户ID为..的用户不再是超级用户”或者“用户ID为..现在是超级用户”,所以这个函数能识别 is_superuser 字段,并且可以读取里面的内容。不过,超级用户的状态却没有改变。

这是不是一个特殊的字段,我没有权限去更改呢?

编辑:这是修正后的代码,现在可以正常工作了。谢谢你,Daniel!

def change_su(request):

    if request.method == 'POST':
        ids = request.POST.getlist('selected')

        for id in ids:
            try:
                rev = Reviewer.objects.get(pk=id)
                if rev.is_superuser == 1:
                    rev.is_superuser = 0
                    rev.save()
                    messages.info(request, _('User with id %(id)s is no superuser anymore') % {'id': id})
                else:
                    rev.is_superuser = 1
                    rev.save()
                    messages.info(request, _('User with id %(id)s is now superuser') % {'id': id})

            except Exception as e:
                logging.getLogger(__name__).exception(e)
                messages.error(request, _('Failed to change superuser status for reviewer with id %(id)s') % {'id': id})

 return HttpResponseRedirect(reverse('admin_index'))

1 个回答

2

你似乎没有在任何地方调用 rev.save() 这个方法,所以你所做的更改不会被保存到数据库里。

撰写回答