【问题标题】:Append "Teacher" to "Student" Profile将“教师”附加到“学生”个人资料
【发布时间】:2020-11-14 09:41:38
【问题描述】:

我有以下模型设置:

class User(AbstractUser):
    is_student = models.BooleanField(default=False)
    is_teacher = models.BooleanField(default=False)

class StudentProfile(models.Model):
    student = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    teacher = models.ForeignKey('TeacherProfile', on_delete=models.SET_NULL, blank=True, null=True)

class TeacherProfile(models.Model):
    teacher = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)

在我看来,我希望老师将自己作为学生的老师添加到学生档案中。这是我迄今为止所拥有的:

def teach_student(request, student_id):
    student = get_object_or_404(Student, student_id=student_id)
    StudentProfile.objects.create(teacher=request.user.teacher, student=student)
    return redirect('account:path_to_students_without_teacher')

问题:

StudentProfile.objects.create(teacher=request.user.teacher, student=student) 出现错误

Cannot assign "<StudentProfile: Student One (@student)>": "StudentProfile.student" must be a "User" instance.

问题:

关于如何允许老师将自己附加为学生的老师的任何建议?

【问题讨论】:

    标签: python python-3.x django profile user-profile


    【解决方案1】:

    在您的数据模型中,StudentProfile 上的字段 student 指的是 User。但是,在您的方法中,您似乎有一个名为Student 的类。您没有指定此类的来源,但似乎这就是 Django 所抱怨的:方法中的变量student 的类型为Student,而它应该为User 的类型。

    【讨论】:

    • 在从视图中的用户而不是 StudentProfile 模型中获取时,我遇到了“唯一约束失败错误”关于解决方案的任何想法?
    • 这取决于具体的错误,但我的第一个猜测是你应该用StudentProfile.objects.update_or_create替换StudentProfile.objects.create
    【解决方案2】:

    您的模型类是您的问题,您为自定义用户字段创建了一个 AbstractUser 类,但它只包含 is_studentis_teacher 您必须在组模型中设置它,而不是在您的用户模型中设置这些,所以您必须有一个用户并且该用户与一个或多个组相关,例如管理员、教师、学生、校长或...

    接下来你不需要class StudentProfile(models.Model),你必须将该字段放在AbstractUser类中

    class User(AbstractUser):
        # set any field like phone_number or something except f-name, l-name, or anything that django create that by defult
        
    

    无论如何 你这里没有任何学生模型,你需要

    def teach_student(request, student_id):
        student = get_object_or_404(User, student_id=student_id)
        StudentProfile.objects.create(teacher=request.user, student=student)
        return redirect('account:path_to_students_without_teacher')
    

    最安全的方法是检查该用户是否是老师并检查登录

    @login_required
    def teach_student(request, student_id):
        teacher = User.object.get(id=request.user.id)
        if teacher.is_teacher:
            student = get_object_or_404(User, student_id=student_id)
            StudentProfile.objects.create(teacher=request.user, student=student)
            return redirect('account:path_to_students_without_teacher')
        else:
            return False # or redirect to another page and show an error
    

    如果你为用户设置组,你可以做更多的事情来在你的定义中设置权限

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 2020-08-31
      • 2011-12-15
      • 1970-01-01
      相关资源
      最近更新 更多