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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:40:21