为 Django 组中的用户分配权限

Assign permissions to users in Django groups

我将 Django (3) 与使用 BaseAbstractUser 的自定义用户模型一起使用,其中我有一个名为 is_instructor 的 BooleanField 字段,还创建了一个名为 instructor 的组。因此,当用户使用 is_instructor 注册时,他将拥有 instructor 组的所有权限。我在 Django 管理员中为这个组分配了与我的 courses 应用程序相关的所有权限。现在,如果我尝试使用具有 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')

有什么问题吗?

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

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

在用户模型中,仅当 is_admin 为 True

时才返回 True

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