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

Django开发问题:如何获取指定职位候选人?多职位时前端不显示

问题分析与解决方案

核心问题

  1. 视图函数逻辑错误:循环遍历职位时,candidates、votes、instruction变量会被每次循环覆盖,最终只有最后一个职位的数据被传入模板,无法关联每个职位对应的候选人信息。
  2. 模板渲染错误:模板中使用全局的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:40:27