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

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>

你之前错误的原因解析

  1. activity() missing 1 required positional argument: 'request':第一个视图用了def activity(self,request, **kwargs)的写法,这是类视图(比如View子类)的方法格式,但你作为函数视图使用时不需要self参数,导致参数不匹配报错。
  2. type object 'set' has no attribute 'excercises':你写的Set.objects.filter(sets=set.excercises)中,set是Python内置的集合类型,不是你的模型实例,同时混淆了模型外键字段和related_name的用法,过滤逻辑完全错误。
  3. 显示所有Set:之前的视图使用Set.objects.all()没有添加过滤条件,自然会返回数据库中所有Set数据,不符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:36:32