You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何展示当前登录用户的关联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列表?我哪里操作错误了?


错误分析与解决方案

核心错误点

  1. 404错误根源:
    • 访问根路径/时,当前启用的路由是user/<str:username>/,根路径没有匹配项,直接返回404;
    • 即使访问user/xxx/,你的get_queryset方法没有返回查询集,ListView无法渲染数据,同时如果URL里的用户名不存在也会触发404。
  2. 冗余的URL参数:要展示当前登录用户的数据,完全不需要在URL里传递用户名,直接通过request.user就能获取当前用户,多此一举的参数反而增加出错概率。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:31:17