Django开发问题:如何获取指定职位候选人?多职位时前端不显示
问题分析与解决方案
核心问题
- 视图函数逻辑错误:循环遍历职位时,
candidates、votes、instruction变量会被每次循环覆盖,最终只有最后一个职位的数据被传入模板,无法关联每个职位对应的候选人信息。 - 模板渲染错误:模板中使用全局的
candidates变量遍历,且引用候选人属性时变量名错误(用了candidate而非循环变量c),同时全局instruction无法匹配每个职位的投票规则。
修复后的视图函数
def index(request): positions = Position.objects.order_by('priority').all() for position in positions: # 组装每个职位的候选人及对应票数 candidates_with_votes = [] candidates = Candidate.objects.filter(position=position) for candidate in candidates: vote_count = Votes.objects.filter(candidate=candidate).count() candidates_with_votes.append({ 'candidate': candidate, 'vote_count': vote_count }) # 将候选人数据绑定到当前职位对象 position.candidates_with_votes = candidates_with_votes # 生成当前职位的投票指令 if position.max_vote > 1: position.instruction = f"You may select up to {position.max_vote} candidates" else: position.instruction = "Select only one candidate" context = { 'positions': positions, } return render(request, 'poll/index.html', context)
修改说明
- 不再使用全局变量存储候选人、票数和指令,而是将每个职位对应的候选人(含票数)和指令直接绑定到
Position实例上 - 用列表字典的形式存储候选人与票数的关联关系,方便模板调用
修复后的模板代码
{% block content %} <div class="row"> <div class="mt-5"> {% for p in positions %} <p>{{ p.instruction }}</p> <h1>{{ p.name }}</h1> <p>{{ p.description }}</p> {% for item in p.candidates_with_votes %} <h2>{{ item.candidate.fullname }}</h2> <p>票数: {{ item.vote_count }}</p> {% empty %} <p>该职位暂无候选人</p> {% endfor %} {% endfor %} </div> </div> {% endblock %}
修改说明
- 遍历每个职位时,直接调用该职位绑定的
instruction和candidates_with_votes数据,确保数据与职位一一对应 - 修复候选人属性引用错误的问题,使用循环变量
item获取候选人信息 - 添加
{% empty %}分支,处理职位无候选人的边界情况
内容的提问来源于stack exchange,提问作者Oluwaseyi Obanibi
相关产品推荐
相关产品推荐

