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
相关产品推荐
相关产品推荐

