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

