如何在 Django ListView 中正确过滤当前用户的照片数据
本文解决 Django ListView 中因错误覆盖 context_object_name 导致上下文为空的问题详解如何安全地按登录用户过滤照片、保留分页与默认行为并提供可复用的代码实践与关键注意事项。 本文解决 django listview 中因错误覆盖 context_object_name 导致上下文为空的问题详解如何安全地按登录用户过滤照片、保留分页与默认行为并提供可复用的代码实践与关键注意事项。在 Django 的 ListView 中若需让每个登录用户仅查看自己上传的照片绝不能直接覆写 context[photos] 为新的 QuerySet——这会破坏 ListView 内置的分页逻辑如 page_obj、is_paginated、对象计数及默认上下文结构导致模板中 photos 变为空或分页失效。根本问题在于你调用了 super().get_context_data()但随后用 context[photos] ... 完全替换了由 ListView 自动注入的、已包含分页信息的 QuerySet。正确做法是在 get_queryset() 中完成数据过滤让 ListView 基于过滤后的 QuerySet 自动构建完整上下文。? 正确实现如下# views.pyfrom django.contrib.auth.mixins import LoginRequiredMixinfrom django.views.generic import ListViewclass PhotoList(LoginRequiredMixin, ListView): model Photo template_name main/gallery.html context_object_name photos paginate_by 12 # 可选启用分页 def get_queryset(self): # 始终从当前用户出发过滤 qs Photo.objects.filter(userself.request.user) # 按 category 参数进一步筛选若提供 category_name self.request.GET.get(category) if category_name: qs qs.filter(category__namecategory_name) return qs def get_context_data(self, **kwargs): context super().get_context_data(**kwargs) # 仅添加额外上下文不干扰 photos 主体 context[categories] Categories.objects.all() return context? 关键说明 橙篇 百度文库发布的一款综合性AI创作工具