Django如何将已登录用户关联的双模型数据渲染到HTML表格
问题排查与修复方案
1. 现有代码核心问题
- 模型层:两个表没有关联关系,无法匹配对应申诉的解决方案;缺少和登录用户的关联字段,无法筛选当前用户的专属数据
- 视图层:没有做数据关联处理,也没有过滤已登录用户的专属数据;传递给模板的变量没有
data,导致总数统计报错 - 模板层:循环变量重名(两个循环都用了
i),嵌套循环会导致每个申诉行重复输出所有解决方案;有多余的闭合div标签,HTML结构错误;样式属性写法不规范无法生效
2. 分步修复代码
2.1 修改models.py
新增用户关联字段、申诉与解决方案的关联字段:
from django.contrib.auth.models import User from django.db import models class studentgriev(models.Model): ch = ( ("Solved","Solved"),("Pending","Pending"),("Not Solved","Not Solved") ) # 关联登录用户,用于后续筛选当前用户的专属数据 user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="stu_grievances") name = models.CharField(max_length=30,default='',null=False) contactnum = models.IntegerField(default='',null=False) email = models.EmailField(max_length=50,default='',null=False) grievance = models.TextField(default='',null=False) date_time = models.DateTimeField(auto_now_add=True) status = models.CharField(max_length=100,choices=ch,default='') def __str__(self): return self.name + " " class facgrieve(models.Model): # 一对一关联对应学生申诉,一个申诉对应一个解决方案 griev = models.OneToOneField(studentgriev, on_delete=models.CASCADE, related_name="solution") solution = models.TextField(default='',null=False) def __str__(self): return self.solution + " "
修改完成后执行命令更新数据库:python manage.py makemigrationspython manage.py migrate
2.2 修改views.py
过滤当前登录用户的数据,关联查询对应解决方案:
def managestugriev(request): # 只查询当前登录用户的申诉,同时关联查询对应解决方案,减少数据库查询次数 from_stugrievance = studentgriev.objects.filter(user=request.user).select_related("solution").all() total_count = from_stugrievance.count() return render(request,'manageGriev.html', {"data_form_stu":from_stugrievance, "total_count": total_count})
2.3 修改模板文件
修复结构错误、变量错误与循环逻辑:
<div> <div> <h2><center>Manage Your Grievances Here</center></h2> <h3>Your Total Grievances: {{total_count}}</h3> <table class="center"> <thead> <tr style="text-align: justify;"> <th>ID</th> <th>Grievance</th> <th>Date & Time</th> <th>Status</th> <th>Solution</th> </tr> </thead> <tbody> {% for griev in data_form_stu %} <tr style="text-align: justify;"> <td style="padding:10px">{{forloop.counter}}</td> <td>{{griev.grievance}}</td> <td>{{griev.date_time}}</td> <td>{{griev.status}}</td> <!-- 直接读取关联的解决方案,无数据时显示默认提示 --> <td>{{griev.solution.solution|default:"暂无解决方案"}}</td> </tr> {% endfor %} </tbody> </table> </div> </div>
3. 补充说明
新增的用户关联字段需要在提交申诉的逻辑中同步赋值当前登录用户,确保数据归属正确。如果你的需求是同时展示学生申诉、老师申诉两类完全独立的数据,可以在视图中将两个查询集合并为一个列表后传递给模板,再统一循环渲染即可。
内容的提问来源于stack exchange,提问作者Dcoder
相关产品推荐
相关产品推荐

