django自定义用户模型用户创建问题:权限无效

问题描述 投票:0回答:1

我在django中创建了一个自定义用户模型,但不知何故,通过创建表单创建的任何新用户都缺少其分配的权限(is_active,is_staff,is_admin),从而阻止他们登录。

有谁能告诉我哪里出错了?任何建议都非常感谢!

代码片段:

models.朋友

class MyUserManager(BaseUserManager):
    use_in_migrations = True
    def create_user(self, ID, name, email, privilege, password=None):

        if not ID:
            raise ValueError('Users must have a ID number')

        user = self.model(
            ID=ID,
            name=name,
            email=self.normalize_email(email),
            privilege=privilege,
            )

        if self.privilege == 'Admin':
            self.is_superuser = True
        else:
            user.is_active = True
            user.is_staff = False
            user.is_admin = False

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

    def create_superuser(self, NIP, name, email, privilege, password):
        new_user = self.create_user(
            ID,
            name,
            email,
            privilege,
            password=password,
        )

        new_user.is_superuser = True
        new_user.save(using=self._db)
        return new_user

class employee(AbstractBaseUser, PermissionsMixin):
    ID = models.IntegerField(verbose_name="ID", unique=True)
    name = models.CharField(verbose_name="Name", max_length=50, blank=True, unique=True)
    email = models.EmailField(verbose_name="email", max_length=225, default='[email protected]')
    Department = models.CharField(max_length=50, choices=DEP_CHOICES, default='')
    Role = models.CharField(max_length=50, choices=ROLE_CHOICES, default='')
    privilege = models.CharField(max_length=10, default='User')
    is_admin = models.BooleanField()
    is_staff = models.BooleanField()
    is_active = models.BooleanField()

forms.朋友

class CustomUserCreationForm(UserCreationForm):
    ID = forms.CharField(max_length=50)
    password = forms.CharField(widget=forms.PasswordInput)

    class Meta(UserCreationForm):
        model = employee
        fields = "__all__"

class CustomUserChangeForm(UserChangeForm):
    ID = forms.CharField(max_length=50)
    password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = employee
        fields = "__all__"

admin.朋友

class UserAdmin(BaseUserAdmin):
    # The forms to add and change user instances
    add_form = CustomUserChangeForm
    form = CustomUserChangeForm
    model = employee

    list_display = ('ID', 'name', 'email', 'privilege')
    list_filter = ('is_admin',)
    fieldsets = (
        (None, {'fields': ('ID', 'password')}),
        ('Personal info', {'fields': ('name', 'email', 'privilege')}),
        ('Permissions', {'fields': ('is_admin', 'is_staff', 'is_active')}),
    )

    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('ID', 'name', 'email')}
        ),
    )
    search_fields = ('name',)
    ordering = ('ID',)
    filter_horizontal = ()

views.朋友

def employee_list(request):
    data_list = Employee.objects.order_by('NIP')
    registered = False

    if request.method == "POST":
        if 'add_user' in request.POST:
            user_form = CustomUserCreationForm(request.POST, prefix='add')

            if user_form.is_valid():
                new_user = user_form.save()
                new_user.set_password(user.password)
                new_user.save()
                registered = True

            return HttpResponseRedirect(reverse('employee'))

    else:
        user_form = CustomUserCreationForm(prefix='add')

    return render(request, 'employee_list.html',
                            {'SignUpForm': user_form,
                            'registered': registered,
                            'Emp_list':data_list})
python django model permissions
1个回答
0
投票

而不是使用'priviledge'作为Employee模型中的字符字段,这很容易在用户输入中出错,而是使用选择字段。

class MyUserManager(BaseUserManager):
use_in_migrations = True

def create_user(self, name, email, privilege='member', is_admin=False, is_staff=False, password=None):

    if not email:
        raise ValueError('Users must have an email address')

    user = self.model(
        name=name,
        email=self.normalize_email(email),
        privilege=privilege,
        )

    user.set_password(password)
    user.is_active = True
    user.is_staff = is_staff
    user.is_admin = is_admin
    user.save(using=self._db)
    return user

def create_superuser(self, name, email, password):
    new_user = self.create_user(
        name,
        email,
        privilege='admin',
        password=password,
        is_staff=True,
        is_admin=True
    )
    return new_user


class Employee(AbstractBaseUser):
    PRIVILEGE_LEVEL = (
        ('Administrator', 'admin'),
        ('Staff', 'staff'),
        ('Member', 'member'),
    )

    # ID = models.IntegerField(verbose_name="ID", unique=True)
    id = models.AutoField(primary_key=True)
    name = models.CharField(verbose_name="Name", max_length=50, blank=True, unique=True)
    email = models.EmailField(verbose_name="email", max_length=225, default='[email protected]')
    Department = models.CharField(max_length=50, choices=DEP_CHOICES, default='')
    Role = models.CharField(max_length=50, choices=ROLE_CHOICES, default='')
    # privilege = models.CharField(max_length=10, default='User')
    privilege = models.CharField(max_length=120, choices=PRIVILEGE_LEVEL, default='member')
    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)

此外,'id'由django自动生成为主键字段,因此它不必是前端形式。

默认情况下,django模型表单调用MyUserManager.create_user。并且基于我上面做出的修改,它默认创建没有权限的用户。除非is_admin和is_staff被隐式设置为True

要从当前表单创建超级用户,可以像这样更新MyUserManager.create_user,

def create_user(self, name, email, privilege='member', is_admin=False, is_staff=False, password=None):

    if not email:
        raise ValueError('Users must have an email address')

    user = self.model(
        name=name,
        email=self.normalize_email(email),
        privilege=privilege,
        )

    user.set_password(password)
    user.is_active = True
    user.is_staff = is_staff
    user.is_admin = is_admin
    if privilege == 'admin':
        user.is_superuser = True
    user.save(using=self._db)
    return user

但我会建议您更新您的CustomUserCreationForm,因此,

class CustomUserCreationForm(UserCreationForm):
# ID = forms.CharField(max_length=50)
password = forms.CharField(widget=forms.PasswordInput)

class Meta(UserCreationForm):
    model = Employee
    fields = "__all__"

# ADD THIS
def clean(self, value):
    print(self.data)
    print(self.errors)
    cleaned_data = self.cleaned_data
    print(cleaned_data)
    return cleaned_data
# ADD THIS

def save(self, *args, **kwargs):
    data = self.cleaned_data
    # email, password1 = v['email'], v['password1']
    employee = None
    if data['privilege'] == 'admin':
        employee = Employee.objects.create_superuser(
            name=data['name'],
            email=data['email'],
            password=data['password'],
        )
    else:
        employee = Employee.objects.create_user(
            name=data['name'],
            email=data['email'],
            password=data['password'],
        )
    # User is already saved after calling BaseUserManager function.
    return employee

MyUserManager.create_superuser调用MyUserManager.create_user并根据传递给它的参数对其进行更新。

如果您需要进一步澄清,请与我们联系。干杯。

© www.soinside.com 2019 - 2024. All rights reserved.