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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:32:42