如何展示当前登录用户的关联Item列表?排查404错误
问题描述
我希望展示仅与当前登录用户相关联的Item数据,且已确认该用户名下存在对应Item,但目前访问时出现Not Found: /错误,不清楚原因。
相关代码
models.py
class Item(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True)
urls.py
urlpatterns = [ #path('', home.as_view(), name='home'), <-- 返回404 path('user/<str:username>/', home.as_view(), name='home'), <-- 同样返回404 ]
views.py(尝试版本)
class home(LoginRequiredMixin, ListView): model = Item template_name = 'app_name/base.html' context_object_name = 'items' # queryset = Item.objects.filter(user=User) def get_queryset(self): user = get_object_or_404(User, username=self.kwargs.get('username')) print(user) # return Item.objects.filter(user=user)
home.html片段
{% block head_title %} {{ view.kwargs.username }} | {% endblock %}
我的问题:如何展示仅与当前登录用户相关的Item列表?我哪里操作错误了?
错误分析与解决方案
核心错误点
- 404错误根源:
- 访问根路径
/时,当前启用的路由是user/<str:username>/,根路径没有匹配项,直接返回404; - 即使访问
user/xxx/,你的get_queryset方法没有返回查询集,ListView无法渲染数据,同时如果URL里的用户名不存在也会触发404。
- 访问根路径
- 冗余的URL参数:要展示当前登录用户的数据,完全不需要在URL里传递用户名,直接通过
request.user就能获取当前用户,多此一举的参数反而增加出错概率。 - get_queryset未返回有效数据:你注释掉了返回查询集的代码,就算获取到用户对象也没用,ListView依赖这个方法返回过滤后的数据集。
修正步骤
1. 调整路由配置(urls.py)
恢复根路径路由,去掉不必要的用户名参数:
urlpatterns = [ path('', home.as_view(), name='home'), ]
2. 修正视图逻辑(views.py)
修改get_queryset方法,直接用当前登录用户过滤数据,并确保返回QuerySet:
from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic import ListView from .models import Item class home(LoginRequiredMixin, ListView): model = Item template_name = 'app_name/base.html' context_object_name = 'items' def get_queryset(self): # 直接通过self.request.user获取当前登录用户,无需从URL取参数 return Item.objects.filter(user=self.request.user)
3. 优化模板(home.html)
登录后模板中可直接使用user变量,无需从view的kwargs中获取:
{% block head_title %} {{ user.username }} | {% endblock %}
额外注意事项
- 确认
LoginRequiredMixin生效,未登录用户会被自动跳转到登录页面; - 如果Item必须关联用户,可以去掉模型中
user字段的blank=True, null=True,避免出现无关联的Item数据。
内容的提问来源于stack exchange,提问作者A_K
相关产品推荐
相关产品推荐

