如何在Django通用ListView中获取URL传递的主键pk
Django ListView获取URL路径中pk的解决方案
Django所有基于类的视图(CBV)中,URL捕获的路径参数都会自动存入self.kwargs属性(字典格式,键为URL配置中定义的参数名),你这里直接通过self.kwargs['pk']即可拿到学生主键,无需切换为函数视图。
完整修改后的视图代码如下:
class CalendarView(LoginRequiredMixin, generic.ListView): model = Class template_name = 'leads/calendar.html' def get_queryset(self): # 获取URL路径中传递的学生主键 student_pk = self.kwargs['pk'] # 过滤仅返回该学生关联的Class数据,外键字段请替换为你实际模型中的字段名 # 示例中假设Class模型关联学生的外键名为lead,和你模板中传的lead.pk对应 return super().get_queryset().filter(lead_id=student_pk) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 若需要在模板中展示学生信息,可将学生实例传入上下文 # context['current_student'] = Student.objects.get(pk=self.kwargs['pk']) # 原有日历逻辑保持不变 d = get_date(self.request.GET.get('month', None)) cal = Calendar(d.year, d.month) html_cal = cal.formatmonth(withyear=True) context['calendar'] = mark_safe(html_cal) context['prev_month'] = prev_month(d) context['next_month'] = next_month(d) return context
注意事项
- 上述代码中
filter(lead_id=student_pk)的字段名需要替换为你Class模型中实际关联学生的外键字段名,如果你用的是外键对象过滤,也可以写为filter(lead__pk=student_pk) - 建议增加权限校验逻辑,比如在
get_queryset中额外增加和当前登录用户关联的过滤条件,避免用户手动修改URL参数越权查看其他学生的日历信息
内容的提问来源于stack exchange,提问作者coderDcoder
相关产品推荐
相关产品推荐

