python - 为 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')
有什么问题?
解决方案
发生这种情况是因为您有覆盖has_perm
方法
def has_perm(self, perm, obj=None):
return self.is_admin
is_admin
在用户模型中,仅当为 True时才返回True
删除此方法或正确检查perm
权限。
推荐阅读
- python-3.x - 返回重定向不会传递参数
- python-3.x - django admin filter_list by manytomany 归档
- javascript - 如何在 React 中更改 OrbitControl 目标?
- docker - 使用 helm chart kubernetes 部署 wildfly 应用程序
- python - 让玩家在 Pygame 中创建和访问其帐户需要什么?
- javascript - 滚动到底部(和强制回流性能问题)
- java - 如何将文件上传到 Sharepoint?
- xcode - 当我使用 xcode 登录开发者帐户时,Xcode 一直在使用带宽
- css - 为什么不应用内联样式定义
- android - EditText - 如何检测输入 3 个或更多字符并执行搜索