Django技术问题:如何仅展示当前登录用户的排班数据?
解决Django中仅显示当前登录用户排班的问题
核心问题
你当前视图里用RosteringUser.objects.all()会查询所有用户的排班关联记录,没有过滤当前登录用户,所以页面显示了全部数据。同时代码存在两处可优化的地方:循环查询数据库会引发性能问题,模板里的字段引用也有误。
修改步骤
1. 过滤当前登录用户的排班记录
通过request.user获取当前登录用户,过滤RosteringUser中user字段匹配当前用户的记录,同时用select_related一次性拉取关联的排班数据,避免循环查库:
from django.contrib.auth.decorators import login_required @login_required # 确保只有登录用户能访问该页面 def my_shift(request): if request.method == 'GET': # 筛选当前用户的排班关联记录,同时预加载关联的Rostering数据 queryset = RosteringUser.objects.filter(user=request.user).select_related('rostering_user') return render(request, 'my_shift.html', {'queryset': queryset})
2. 修复模板中的字段引用错误
RosteringUser模型里关联Rostering的字段是rostering_user,无需手动修改obj.id,模板直接引用该字段即可:
{% for obj in queryset %} <tr> <td>{{ obj.user.user_name }}</td> <td>{{ obj.rostering_user.name }}-{{ obj.rostering_user.begin_time }}</td> <td>{{ obj.rostering_user.name }}-{{ obj.rostering_user.end_time }}</td> </tr> {% endfor %}
额外说明
@login_required装饰器会自动拦截未登录用户,跳转到登录页面,避免因request.user为空导致的报错。select_related用于一对一/外键关联的预加载,能把两次数据库查询合并为一次,大幅提升页面加载效率。
内容的提问来源于stack exchange,提问作者krisssz
相关产品推荐
相关产品推荐

