【问题标题】:Django : Authenticated different user modelsDjango:认证不同的用户模型
【发布时间】:2016-12-13 13:48:18
【问题描述】:

在我的项目中,我有 2 个模型,分别名为 StudentsTeachers。这两个模型是 User 的 OneToOne 字段。 我有 3 个应用程序:home(索引页、常见问题解答、关于...)、teachers(教师界面、管理她的课程、编辑个人资料...)和 students(学生界面,简介...)

我有一个登录表单(在应用程序主页中),我想用它来登录教师和学生,并在验证后重定向到正确的应用程序。这样做的最佳方法是什么?我想创建两个组(教师和学生)并在注册表格后分配到正确的组,并在登录表单中检查组?

PS:学生可以创建账号,但是对于老师,我们的团队会创建账号,所以我们没有老师的注册表

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    如果与 User 表的关系是 OneToOne,您可以从 user.student 或 user.teacher 访问它,所以您会这样做...

    def login_view(request):
       if form.is_valid():
          # get user from form
          _user = form.get_user()
          user = authenticate(form.cleaned_data['username'], form.cleaned_data['password'])
          login(request, user)
          if hasattr(user, 'student'):
              # You'll return to student app
              return redirect('studen:home')
          # else
          return redirect('teacher:home')
    

    编辑

    装饰器.py

    ...
    from django.contrib.auth.decorators import user_passes_test
    def group_required(*args):
        if args:
            def decorator(user):
                if user.is_staff or user.is_superuser:
                    return True
                return user.is_authenticated() and user.groups.filter(name__in=args).exists()
        else:
            decorator = lambda x: x.is_authenticated()
    
        return user_passes_test(decorator)
    ...
    

    然后使用它...

    ...
    @group_required('student')
    def home_student(request):
       # some code
    
    @group_required('teacher', 'student'):
    def common_view_for_all(request):
       # some code
    ...
    

    【讨论】:

    • 谢谢,但如果我想保护学生对教师视图的访问,我认为这是创建组和使用装饰器的最佳方式吗?
    • 是的,装饰者分组,我将更新答案以解释如何......
    猜你喜欢
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多