Django模板嵌套for循环问题:实现活动邀请发送/取消按钮功能
问题根源
原模板的嵌套循环逻辑错误:遍历每个用户profile时,会循环当前活动的所有邀请记录,每一条记录都会输出一个按钮,所以单个用户的按钮数量和活动已发邀请总数一致,完全不符合预期。
最优实现方案(推荐)
步骤1:视图层预处理数据(性能最优,减少模板冗余逻辑)
提前在视图中将当前活动已邀请的用户ID提取为集合,后续判断时间复杂度为O(1),远高于模板循环判断的效率。
修改后的视图代码:
def get_list_of_all_users(request, event_id): """获取所有用户列表""" event = Event.objects.get(id=event_id) profiles = Profile.objects.all() # 提取当前活动所有已邀请的profile id,存为集合方便快速判断 invited_profile_ids = set(EventInviteRequest.objects.filter(from_event=event).values_list('to_profile_id', flat=True)) context = { 'profiles': profiles, 'event': event, 'invited_profile_ids': invited_profile_ids } return render(request, 'events/invite_all_profiles_to_event.html', context)
步骤2:替换模板中的嵌套循环代码
删除原来的{% for req in requests %}循环段,替换为如下逻辑:
{% if request.user.profile != profile %} <br> {% if profile.id in invited_profile_ids %} <a href="{% url 'events:cancel_event_invite' event.id profile.id %}">取消邀请</a> {% else %} <a href="{% url 'events:invite_user_to_event' event.id profile.id %}">发送邀请</a> {% endif %} {% endif %}
你当前临时方案的问题
你自己写的临时方案没有过滤「当前活动」的限制,只会判断该profile是否收到过任意活动的邀请,如果该用户收到过其他活动的邀请,就会出现判断错误、多按钮重复的问题,仅可临时应急使用,不建议长期上线。
内容的提问来源于stack exchange,提问作者Saviola
相关产品推荐
相关产品推荐

