Отображение данных, связанных с вошедшим в систему пользователем в Django - PullRequest
0 голосов
/ 09 февраля 2019

Я строю эту простую систему для школы, где ученики могут войти в систему, чтобы увидеть свои результаты в конце каждого семестра.Я разработал модель для экзаменов с множеством отношений с пользователем.Мои проблемы в моем шаблоне, мне трудно показать результаты экзаменов, связанных с вошедшим в систему пользователем.

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

То, что я пытаюсь сделать, это показать зарегистрированному ученику только его результаты, основанные на экзаменах, которые он сдал, и, скорее, показывает мне все.Даже те, которые он не взял.

1 Ответ

0 голосов
/ 09 февраля 2019

вы можете retrive эти экзамены по set_all look_up_relationship или вручную можете запросить модель экзамена.

возможный путь может быть таким

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 )
...