为 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
权限。
我将 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
删除此方法或正确检查 perm
权限。