首页 > 解决方案 > 在 Django 中显示与登录用户相关的数据

问题描述

我正在为一所学校构建这个简单的系统,学生可以在其中登录以在每个学期结束时查看他们的结果。我设计了一个与用户具有多对多关系的考试模型。我的问题在我的模板中,我发现很难显示与登录用户相关的考试结果。

models.py

class StudentProfile(models.Model):
    SEX_CHOICES = (
        ('Male', 'Male'),
        ('Female', 'Female')
    )
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    other_name = models.CharField(max_length=30, null=True, blank=True)
    birth_of_date = models.DateField(null=True, blank=True)
    birth_Of_admission = models.DateField(null=True, blank=True)
    nationality = models.CharField(max_length=120)
    phone_number = models.CharField(max_length=15, validators=[MinLengthValidator(10)])
    gender = models.CharField(max_length=120, choices=SEX_CHOICES)
    home_address = models.CharField(max_length=250, null=True, blank=True, )
    passport_picture = models.ImageField(upload_to='passport_picture', null=True, blank=True,
                                         help_text='Upload the passport picture here')

    def __str__(self):
        return "%s %s" % (self.user.first_name, self.user.last_name)


    @receiver(post_save, sender=User)
    def create_or_update_user_profile(sender, instance, created, **kwargs):
        if created:
            StudentProfile.objects.create(user=instance)
        instance.studentprofile.save()


    class Subject(models.Model):
        subject_name = models.CharField(max_length=30, null=True, blank=True)

    def __str__(self):
        return self.subject_name


    class Year(models.Model):
        year = models.CharField(max_length=30, null=True, blank=True)

    def __str__(self):
        return self.year


    class Exam(models.Model):
        TERM_CHOICES = (
            ('First Term', 'First Term'),
            ('Second Term', 'Second Term'),
            ('Third Term', 'Third Term')
        )
        level = models.ForeignKey('Level', null=True, blank=True, on_delete=models.CASCADE)
        student = models.ForeignKey(Year, null=True, blank=True, on_delete=models.CASCADE)
        year = models.ForeignKey(Year, null=True, blank=True, on_delete=models.CASCADE)
        subject = models.ForeignKey(Subject, null=True, blank=True, on_delete=models.CASCADE)
        term = models.CharField(max_length=120, default="", choices=TERM_CHOICES)
        mid_term_score = models.PositiveSmallIntegerField(help_text='the marks scored for mid term exams')
        End_of_term_score = models.PositiveSmallIntegerField(help_text='the marks scored for end of  term exams')
        class_work_score = models.PositiveSmallIntegerField(help_text='the marks scored for class work')

        def __str__(self):
            return self.subject + "-" + self.term

views.py

class StudentView(LoginRequiredMixin, ListView):
    model = Exam
    template_name = 'student.html'
    context_object_name = 'student'

    def get_object(self):
        return self.request.user.exam

我想做的是根据他参加的考试仅显示登录的学生他的结果,而是向我展示所有内容。甚至那些他没有带走的。

标签: djangodjango-modelsdjango-templatesdjango-views

解决方案


您可以retrive通过 look_up_relationship 进行这些考试,set_all也可以手动查询考试模型。

可能的方式可以是这样

def get_object(self):
    return self.request.user.exam_set.all()

你也可以试试这个

def get_object(self):
    return Exam.objects.filter(student_id=self.request.user.id)

编辑

如果我现在正确理解你,那么学生的当前水平是这个Exam过滤的一个重要因素。我们也应该补充一下,否则所有的考试都会出现。但是从您的Exam模型结构来看,我没有看到任何level与用户模型相关的实体。我假设术语和级别实际上是相同的(很可能不是)

def get_object(self):
        return Exam.objects.filter(student_id=self.request.user.id, term = self.request.user.level )

推荐阅读