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

Django报错Field 'id' expected a number but got 'natsu'及用户文章视图问题

问题分析与解决方案

错误原因

你碰到的Field 'id' expected a number but got 'natsu'错误,核心逻辑很简单:
Post模型里的author是关联User模型的ForeignKey,默认情况下,当你写author=username过滤时,Django会默认把你传入的值当成User模型的主键(也就是整数类型的id)来匹配,但你传的是字符串格式的用户名natsu,类型完全不匹配,自然就报错了。

替代实现方案

这里给你两种实用的解决办法,选哪个都能搞定问题:

方案一:直接通过关联字段过滤(简洁快速)

修改views.py里的user_posts函数,利用Django的双下划线查询语法,直接匹配User模型的username字段:

def user_posts(request, username):
    # 用 author__username 关联到User模型的username字段做匹配
    posts = Post.objects.filter(author__username=username)
    return render(request, 'blog/user_posts.html', {'posts': posts})

方案二:先获取用户对象再过滤(更严谨,推荐)

如果想处理“访问不存在的用户”的情况(比如有人输错用户名访问/user/xxx/),可以用get_object_or_404先拿到对应的User对象,再过滤文章,这样会返回友好的404页面而不是服务器错误:

from django.shortcuts import get_object_or_404

def user_posts(request, username):
    # 先获取对应用户,不存在则返回404
    target_user = get_object_or_404(User, username=username)
    # 用拿到的用户对象过滤他的文章
    posts = Post.objects.filter(author=target_user)
    # 把用户对象也传给模板,方便展示头像等信息
    return render(request, 'blog/user_posts.html', {'posts': posts, 'target_user': target_user})

这种方式还能在模板里拓展展示用户的profile信息,比如在user_posts.html顶部加:

<div class="profile-header">
    <img src="{{ target_user.profile.image.url }}" alt="{{ target_user.username }}'s avatar">
    <h3>{{ target_user.username }}'s Posts</h3>
</div>

小细节优化

你的模板里有个小冗余:{% url 'user-posts' post.author.username %}其实没必要,因为当前页面已经是该用户的文章列表页了,不过这个不影响功能,只是顺手提一下~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:37:40