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

