Django健身项目:如何展示指定Exercise对应的Set数据
解决方案:展示特定Exercise对应的Set数据
步骤1:配置带Exercise ID的URL路由
首先在urls.py中添加带参数的路由,用来接收选中Exercise的主键(ID):
# urls.py from django.urls import path from . import views urlpatterns = [ # 展示所有Exercise的列表页面 path('exercises/', views.exercise_list, name='exercise_list'), # 展示指定Exercise的Set详情页面 path('exercise/<int:exercise_id>/sets/', views.exercise_sets, name='exercise_sets'), ]
步骤2:编写正确的视图函数
1. 展示所有Exercise的列表视图
供用户选择要查看的Exercise:
# views.py from django.shortcuts import render, get_object_or_404 from .models import Exercise, Set def exercise_list(request): exercises = Exercise.objects.all().order_by('id') return render(request, 'my_gym/exercise_list.html', {'exercises': exercises})
2. 展示指定Exercise对应Set的详情视图
接收exercise_id参数,精准过滤出目标Exercise的所有Set:
def exercise_sets(request, exercise_id): # 获取选中的Exercise,不存在则返回404页面 target_exercise = get_object_or_404(Exercise, id=exercise_id) # 通过模型中定义的related_name='sets',直接获取该Exercise下的所有Set,按组序排序 exercise_sets = target_exercise.sets.all().order_by('order') context = { 'exercise': target_exercise, 'sets': exercise_sets, } return render(request, 'my_gym/start_workout.html', context)
步骤3:编写/修改模板文件
1. 所有Exercise的列表模板(exercise_list.html)
给每个Exercise添加跳转链接,指向对应的Set详情页:
<h2>所有训练动作</h2> <ul> {% for exercise in exercises %} <li> <a href="{% url 'exercise_sets' exercise.id %}">{{ exercise.name }}</a> </li> {% endfor %} </ul>
2. 指定Exercise的Set展示模板(start_workout.html)
修改模板,确保只渲染当前选中Exercise的Set数据:
<h2>{{ exercise.name }} 的训练组</h2> <table> <tr> <th>组序</th> <th>次数</th> <th>重量</th> </tr> {% for set in sets %} <tr> <td>{{ set.order }}</td> <td>{{ set.repetitions }}</td> <td>{{ set.weight }}</td> </tr> {% empty %} <tr> <td colspan="3">暂无该动作的训练组数据</td> </tr> {% endfor %} </table>
你之前错误的原因解析
activity() missing 1 required positional argument: 'request':第一个视图用了def activity(self,request, **kwargs)的写法,这是类视图(比如View子类)的方法格式,但你作为函数视图使用时不需要self参数,导致参数不匹配报错。type object 'set' has no attribute 'excercises':你写的Set.objects.filter(sets=set.excercises)中,set是Python内置的集合类型,不是你的模型实例,同时混淆了模型外键字段和related_name的用法,过滤逻辑完全错误。- 显示所有Set:之前的视图使用
Set.objects.all()没有添加过滤条件,自然会返回数据库中所有Set数据,不符合需求。
内容的提问来源于stack exchange,提问作者A_K
相关产品推荐
相关产品推荐

