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

Django实现模板展示当前登录用户点赞的所有用户Profile

Django 实现已点赞会员列表展示方案

现有代码的核心问题

  • 视图层User.objects.all未添加调用括号(),传递给模板的是查询方法本身,而非实际查询结果
  • Django 模板不支持调用带参数的查询方法,你写的{% if member.profile.liked.filter(id=request.user.id).exists()%}逻辑不会被模板引擎执行,判断永远无法生效
  • 过滤逻辑属于业务逻辑,应该在视图层完成,不应当放在模板层实现,既不符合MTV设计规范,查询效率也极低

正确实现代码

1. 修正视图层查询逻辑

利用模型关联直接过滤出当前用户点赞过的用户即可,两种写法都可以生效:

@login_required
def all_fav_members(request):
    # 写法1:利用ManyToMany反向关联查询(你定义的related_name=user_liked就是做这个用的)
    # liked_profiles = request.user.user_liked.all()
    # users = User.objects.filter(id__in=liked_profiles.values_list('user_id', flat=True))

    # 写法2:更简洁的跨表双下划线过滤,推荐使用
    users = User.objects.filter(profile__liked=request.user).distinct()
    
    context = {'members': users}
    return render(request, 'club/all_fav_members.html', context)

说明:profile__liked=request.user是Django ORM的跨表查询语法,意思是筛选出「关联的Profile的liked字段包含当前登录用户」的User对象,也就是你需要的、当前用户点过赞的会员列表,加distinct()是为了避免多对多关联查询可能出现的重复结果。

2. 调整模板代码

视图传过来的members已经是过滤完成的目标数据,不需要再加任何判断逻辑,直接遍历渲染即可,可额外增加空状态提示:

{% if members %}
    {% for member in members %} 
    <table class="table w-100 table-hover">
        <thead>
            <tr id="header-paragraph-table-top">
                <th>Name & Surname</th>
                <th>Email</th>
                <th>Company</th>
            </tr>
        </thead>
        <tbody>
            <tr id="paragraph-table">
                <td>{{ member.first_name|capfirst }} {{ member.last_name|capfirst }}</td>
                <td><a href="mailto:{{ member.email }}">{{ member.email }}</a></td>
                <td>{{ member.profile.company }}</td>
            </tr>
        </tbody>
    </table>
    {% endfor %}
{% else %}
    <p>暂无已点赞的会员记录</p>
{% endif %}

路由配置不需要做任何修改,原有配置可正常使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:24:15