如何撤销在 django admin 中编辑管理员用户的权限

问题描述

我有一个自定义用户模型,我可以在不授予必要权限的情况下创建组。我通过授予查看和更改用户的权限创建了一个组。我向该组添加一个员工用户,但没有将他们升级管理员用户或超级用户。但该用户可以编辑管理员用户。如何阻止该特定组中的用户编辑管理员用户

class MyAccountManager(BaseUserManager):
    def create_user(self,email,username,password=None):
        if not email:
            raise ValueError("Users must have an email address")
        if not username:
            raise ValueError("Users must have an username")
        user = self.model(
            email=self.normalize_email(email),username=username,)

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self,password):
        user = self.create_user(
            email=self.normalize_email(email),password=password,)

        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user


class User(AbstractBaseUser,PermissionsMixin):
    email = models.EmailField(verbose_name='email',max_length=80,unique=True)
    username = models.CharField(max_length=30,unique=True)
    first_name = models.CharField(max_length=100,null=True)
    last_name = models.CharField(max_length=100,null=True)
    phone_no = models.CharField(max_length=12,null=True)
    date_joined = models.DateField(
        verbose_name='date joined',auto_Now_add=True)
    last_login = models.DateField(verbose_name='last login',auto_Now=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_teacher = models.BooleanField(default=False)
    address = models.CharField(max_length=500,null=True,blank=True)

    USERNAME_FIELD = 'username'
    required_FIELDS = ['email']

    objects = MyAccountManager()

    def __str__(self):
        return self.email

    # def has_perm(self,perm,obj=None):
    #     return self.is_admin

    def has_module_perms(self,app_label):
        return True

解决方法

为此,您需要虚拟地分离模型。您可以使用 Django 的 enter image description here。将以下代码添加到 models.py 的底部。

import java.awt.Dimension;
import java.awt.GridBagLayout;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class FrameAccueil {
    private JFrame frame;
    
    public FrameAccueil() {
        frame = new JFrame(getClass().getSimpleName());
        
        JPanel fond = new JPanel() { // Move this code inside your bgfond class
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(1000,500);
            }
        };
        fond.setLayout(new BoxLayout(fond,BoxLayout.PAGE_AXIS));
        
        JPanel boutons = new JPanel(new GridBagLayout());

        JButton btn1 = new JButton("btn1");
        JButton btn2 = new JButton("btn1");

        JButton btn1 = new JButton("btn1") { // If you follow point 8,these code shall be moved there and these JButtons should be objects of that class.
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300,50);
            }
        };
        JButton btn2 = new JButton("btn1") {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300,50);
            }
        };

        boutons.add(btn1);
        boutons.add(btn2);

        fond.add(boutons); //Try to first add the inner objects and then the outer ones,so go inside-out as to keep them ordered in a more logical way
        frame.add(fond);

        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new FrameAccueil()); //Place your program on the EDT
    }
}

进行更改后,运行 from django.contrib.auth.models import UserManager class StaffManager(UserManager): def get_queryset(self): qs = super().get_queryset() return qs.filter(is_staff=True) class StaffProxyModel(User): objects = StaffManager() class Meta: proxy = True verbose_name = 'Staff' verbose_name_plural = 'Staffs' #admin.py from django.contrib.auth.admin import UserAdmin class StaffProxyModelAdmin(UserAdmin): pass admin.site.register(StaffProxyModel,StaffProxyModelAdmin) python manage.py makemigrations。完成上述步骤后,您将能够在权限列表中看到“员工代理模型”。向您的组授予对此模型的更改和查看访问权限。你的问题应该得到解决。 Django 会将代理模型视为一个单独的模型,尽管在数据库级别,User 和 Staff 模型存储在同一个表中。