首页 > 解决方案 > 为 Django 组中的用户分配权限

问题描述

我将 Django (3) 与自定义用户模型一起使用BaseAbstractUser,其中我有一个名为 BooleanField 的字段is_instructor,还创建了一个名为instructor. 因此,当用户注册时,is_instructor他将拥有该instructor组的所有权限。courses我在 Django admin 中为这个组分配了与我的应用程序相关的所有权限。现在,如果我尝试使用具有instructor组权限的用户创建一个新课程,它会将我重定向到错误的登录页面,我的实际登录 URL 路径是/users/login,但它会将我重定向到“/accounts/login”。

这是我的模型:

class Account(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(verbose_name='email', max_length=60, unique=True)
    fullname = models.CharField(max_length=30, unique=True)
    is_instructor = models.BooleanField(default=False)
    date_join = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='last login', auto_now_add=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['fullname']

    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

我的注册视图:

def registration_view(request):
    form = RegistrationForm(request.POST or None, request.FILES or None)
    if request.method == 'POST':
        print('get post req')
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = True
            user.save()
            if form.cleaned_data['is_instructor'] is True:
                instructor_group = Group.objects.get(name='instructor')
                instructor_group.user_set.add(user)
            return HttpResponseRedirect(reverse_lazy('users:login'))
    return render(request, 'users/register.html', {'form': form})

这是创建新课程的视图:

class OwnerMixin(object):
    def get_queryset(self):
        qs = super().get_queryset()
        return qs.filter(owner=self.request.user)

class OwnerCourseMixin(OwnerMixin,
                       LoginRequiredMixin,
                       PermissionRequiredMixin):
    model = Course
    fields = ['subject', 'title', 'slug', 'overview', 'course_img']
    success_url = reverse_lazy('manage_course_list')

class OwnerCourseEditMixin(OwnerCourseMixin, OwnerEditMixin):
    template_name = 'courses/manage/course/form.html'

class CourseCreateView(OwnerCourseEditMixin, CreateView):
    permission_required = 'courses.add_course'
    success_url = reverse_lazy('courses:manage_course_list')

有什么问题?

标签: pythonpython-3.xdjangodjango-modelsdjango-admin

解决方案


发生这种情况是因为您有覆盖has_perm方法

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

is_admin在用户模型中,仅当为 True时才返回True

删除此方法或正确检查perm权限。


推荐阅读