Django中如何通过GET方法获取WorkOut对象ID并更新时间字段
解决Django训练记录时间字段更新问题
1. 修正URL配置
首先在urls.py里添加正确路由,确保能接收数字类型的训练记录ID和操作类型(start/end):
# urls.py from django.urls import path from . import views urlpatterns = [ # 其他现有路由... path('update-time/<int:workout_id>/<str:action>/', views.update_workout_time, name='update_workout_time'), ]
这里<int:workout_id>会强制Django解析数字ID,直接规避你之前遇到的ValueError(把字符串当成ID传入)问题。
2. 编写视图函数
在views.py里实现更新逻辑,用GET方法处理请求,定位对应记录并更新时间:
# views.py from django.shortcuts import get_object_or_404, redirect from django.utils import timezone from .models import WorkOut def update_workout_time(request, workout_id, action): workout = get_object_or_404(WorkOut, id=workout_id) current_time = timezone.now() if action == 'start': workout.start = current_time elif action == 'end': workout.end = current_time workout.save() # 重定向回训练记录列表页(替换成你的列表视图名称) return redirect('workout_list')
用get_object_or_404自动处理记录不存在的情况,无需手动捕获异常。
3. 模板中生成正确的按钮链接
在循环展示训练记录的模板里,给每个按钮生成包含正确ID的URL,用Django的{% url %}标签:
<!-- 训练记录列表模板 --> {% for workout in workouts %} <tr> <td>{{ workout.id }}</td> <td>{{ workout.type }}</td> <!-- 展示其他字段... --> <td> <a href="{% url 'update_workout_time' workout.id 'start' %}" class="btn btn-primary">开始训练</a> <a href="{% url 'update_workout_time' workout.id 'end' %}" class="btn btn-secondary">结束训练</a> </td> </tr> {% endfor %}
这里直接传入workout.id(纯数字),确保URL参数是正确的数值,不会出现传入id_start这类错误字符串的情况。
关键提醒
- 不要在URL参数里拼接类似
id_start的字符串,必须传递纯数字的记录ID,配合URL里的<int:workout_id>约束,Django会自动校验参数类型。 - 如果后续考虑安全性(避免误刷新重复提交),可以把按钮改成POST表单提交,但当前方案完全满足你用GET方法的需求。
内容的提问来源于stack exchange,提问作者user19637275
相关产品推荐
相关产品推荐

