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

Django测试报"No User matches the given query"错误求助

问题根因

你手动使用RequestFactory实例化视图时,没有将路由携带的username参数绑定到视图实例的kwargs属性上,导致get_queryset方法中self.kwargs.get('username')取到的值为None,查询用户自然匹配不到结果,抛出404错误。
线上环境正常是因为Django的路由系统在接收到请求、调用视图前,会自动将URL路径中匹配到的参数填充到视图的kwargs属性中,不需要手动处理。

修复方案

方案1:在现有测试逻辑上补充参数绑定

只需要在view.setup(request)之后手动给视图的kwargs赋值即可,修改后的测试代码如下:

def test_get_queryset(self):
    """Testing get_queryset function"""
    url = reverse('user-posts', kwargs={'username': self.user.username})
    request = self.factory.get(url)
    view = UserPostListView()
    view.setup(request)
    # 新增这行,手动绑定路由参数
    view.kwargs = {"username": self.user.username}

    queryset = view.get_queryset()
    self.assertIn(self.post, queryset)

方案2:使用Django自带测试客户端简化测试

Django的TestCase自带测试客户端,会自动走完完整的请求、路由匹配、视图调用流程,不需要手动处理视图实例化和参数绑定,更适合这类视图功能测试,代码更简洁:

def test_get_queryset(self):
    """Testing get_queryset function"""
    url = reverse('user-posts', kwargs={'username': self.user.username})
    response = self.client.get(url)
    # 验证页面正常返回
    self.assertEqual(response.status_code, 200)
    # 验证测试帖子出现在页面对应上下文里
    self.assertIn(self.post, response.context['posts'])

内容的提问来源于stack exchange,提问作者Sofya Kaminskaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:27:01