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

Django如何动态将训练对象按天分配展示

问题分析

你当前的核心问题是模板中{% for exercise in exercises %}循环嵌套在{% for day in days %}内部,导致每遍历一天就会输出全部训练项目,自然出现重复显示的情况。要实现每天分配6个训练的动态适配,需要从数据分组和模板循环逻辑两方面调整。

解决方案

1. 在视图层对训练数据按天分组

修改views.py中的list_1函数,将所有训练数据按每天6个的规则分成若干组,和天数列表一一对应:

def list_1(request):
    generator = Generator.objects.last()
    frequency = int(generator.frequency)
    period = int(generator.period)

    # 修正训练数据查询:按id正序取前frequency*6条(确保是最新生成的训练)
    exercises = Template.objects.all().order_by('id')[:frequency * 6]
    # 按每天6个分组,生成[[day1的6个训练], [day2的6个训练], ...]
    exercises_per_day = [exercises[i:i+6] for i in range(0, len(exercises), 6)]
    # 将天数和对应训练组打包,方便模板遍历
    day_exercise_pairs = zip(days, exercises_per_day)

    days = Day.objects.filter(id__range=(1, frequency))
    weeks = Week.objects.filter(id__range=(1, period))

    context = {
        'day_exercise_pairs': day_exercise_pairs, 
        'weeks': weeks
    }
    return render(request, 'planner/list_1.html', context)

2. 调整模板循环逻辑

修改模板中的循环结构,遍历打包后的天数-训练组对,每个day只渲染对应的6个训练:

<form>
    <div> 
        <table class="table">
            <thead>
                <tr>
                    {% for week in weeks %}
                    <th></th>
                    <th colspan="3">{{week}}</th>
                    {% endfor %}
                </tr>
            </thead>
            <tbody>
                <!-- 遍历天数和对应训练组 -->
                {% for day, day_exercises in day_exercise_pairs %}
                <tr>
                    {% for week in weeks %}
                        <td></td>
                        <td colspan="2">{{day}}</td>
                        <td><input type="text" class="form-control" /></td>
                    {% endfor %}
                </tr>
                <tr>
                    <td>Exercise</td>
                    {%for week in weeks %}
                        <td>Set</td>
                        <td>Weight</td>
                        <td>Reps</td>
                    {% endfor %}
                </tr>
                <!-- 只遍历当天对应的6个训练 -->
                {% for exercise in day_exercises %}
                <tr>
                    <td rowspan="3">{{exercise}}</td>
                    {%for week in weeks %}
                        <td>1</td>
                        <td><input type="text" class="form-control" value="" /></td>
                        <td><input type="text" class="form-control" value="" /></td>
                    {% endfor %}
                </tr>
                <tr>
                    {%for week in weeks %}
                        <td>2</td>
                        <td><input type="text" class="form-control" value="" /></td>
                        <td><input type="text" class="form-control" value="" /></td>
                    {% endfor %}
                </tr>
                <tr>
                    {%for week in weeks %}
                        <td>3</td>
                        <td><input type="text" class="form-control" value="" /></td>
                        <td><input type="text" class="form-control" value="" /></td>
                    {% endfor %}
                </tr>
                {% endfor %}
                {% endfor %}
            </tbody>
        </table>
    </div>
</form>
额外说明
  • 修正了原视图中训练数据的查询逻辑:原代码[:(frequency * 6):-1]切片会导致取数顺序混乱,改为order_by('id')[:frequency * 6]确保取到最新生成的frequency*6个训练。
  • 通过zip将天数和对应训练组绑定,保证模板中每个day只渲染属于自己的6个训练,完全适配表单输入的动态天数和训练数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:05:21