Django访问用户公开资料页时出现Book查询不存在错误
问题修复:访问用户公开资料页时出现「找不到匹配的Book记录」错误
错误现象
运行代码后,访问用户的public_profile页面时,触发错误:Book matching query does not exist.(找不到匹配的Book记录)
问题根源
视图函数存在逻辑错误:
- 传入的
slug是Profile模型的slug,但代码用该slug查询Book.objects.get(slug=slug),而Profile的slug与Book的slug是完全独立的字段,无关联关系,自然找不到对应Book记录。 - 需求是展示该用户发布的所有Book,而
get()方法仅能返回单条记录,既不符合需求,还会在无匹配记录时直接抛出异常。
修复方案
1. 修正视图函数
修改public_profile视图,获取当前用户发布的所有Book,而非错误地用Profile的slug查询Book:
def public_profile(request, slug): profile = get_object_or_404(Profile, slug=slug) # 获取当前用户的所有书籍,可根据需求添加排序规则 books = Book.objects.filter(user=profile.user).order_by('-id') context = { 'profile': profile, 'books': books } return render(request, 'public_profile.html', context)
2. 调整模板展示逻辑
在public_profile.html中遍历展示用户的书籍列表:
<!-- 展示用户发布的书籍 --> <section class="user-books"> <h2 class="title is-5">该用户发布的书籍</h2> {% if books %} {% for book in books %} <div class="book-card"> <h3>{{ book.title }}</h3> <p>{{ book.introduction|truncatechars:100 }}</p> <!-- 可添加书籍图片、分类等其他字段展示 --> </div> {% endfor %} {% else %} <p class="has-text-grey">该用户尚未发布任何书籍</p> {% endif %} </section>
额外说明
- 原模型中的
get_user_public_url方法逻辑正确,它通过用户的Profile slug生成公开资料页链接,无需修改。 - 若需限制用户只能查看公开状态的书籍,可在Book模型中添加
is_public字段,再在视图中过滤filter(user=profile.user, is_public=True)。
内容的提问来源于stack exchange,提问作者Adamu Abdulkarim Dee
相关产品推荐
相关产品推荐

