django - 在 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
我想做的是根据他参加的考试仅显示登录的学生他的结果,而是向我展示所有内容。甚至那些他没有带走的。
解决方案
您可以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 )
推荐阅读
- mysql - 为什么sql不让我创建这个表?
- java - 优化程序以查找数组中的第 k 个最小元素(Java,预期时间复杂度 O(n))
- excel - 包含和删除 Excel 宏中的信息
- ruby-on-rails - 如何使用 ActsAsTaggableOn 列出特定用户正在使用的标签
- r - 闪亮的反应性格式化?
- css - 带有 flexbox 和动态内容的 CSS 网格
- java - Java 11 中的 WebSocket 实现
- python - 如何在Python中达到到期日期时自动删除部分股票?(先进先出方法内)
- javascript - 检查一个数组是否包含另一个数组的任何元素,在 JavaScript 中有一些 null
- javascript - 可拖动的 div 并单击到元素后面