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

Django按钮点击触发但未更新WorkOut模型问题求助

问题:Django中点击按钮无法更新WorkOut模型的Start Time字段

我在Django模板里做了一个展示WorkOut模型数据的表格,表格上方有手动输入表单。表格里有三个动态字段,现在“Start Time”显示为none,想通过点击按钮触发视图函数更新这个字段并在页面显示,后续还要加结束时间和计算逻辑。

模板循环中添加的表单代码:

<td>
    <form method="get">
        <input type="submit" class="btn" value="Start Time" name="start_time">
    </form>
</td>

对应的视图函数index_2:

def index_2(request):
    if(request.GET.get('start_time')):
        time=datetime.now().strftime('%H:%M:%S')
        WorkOut.objects.update(start=time)

    products=WorkOut.objects.all()
    context={'products': products}
    return render(request, 'myapp/index.html', context)

主页面的index视图:

def index(request):
    form = WorkOutForm()
    if request.method == 'POST':
        form = WorkOutForm(request.POST)
        if form.is_valid():
            form.save()
            
    products=WorkOut.objects.all()
    
    context = {'form': form, 'products': products }

    return render(request, 'myapp/index.html', context)

点击按钮后URL变为http://127.0.0.1:8000/?start_time=Start+Time,说明按钮已触发,但模型未按预期更新,请问需要修改哪些内容?


问题原因及修复步骤

1. 按钮提交未指向正确的视图

你的表单没有指定action属性,默认提交到当前页面的index视图,而非处理更新逻辑的index_2视图,导致更新代码根本没执行。

修复:

  • 先在urls.py中给index_2配置URL:
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('update-start/', views.index_2, name='update_start_time'),
]
  • 修改模板表单,指定提交目标URL:
<td>
    <form method="get" action="{% url 'update_start_time' %}">
        <input type="submit" class="btn" value="Start Time" name="start_time">
    </form>
</td>

2. 当前代码会更新所有WorkOut记录

WorkOut.objects.update(start=time)会把数据库中所有WorkOut实例的start字段改成当前时间,这显然不是你要的——你应该是想更新表格中当前行对应的那条记录。

修复:

  • 模板表单传递当前记录的ID:
{% for product in products %}
<tr>
    <!-- 其他表格列 -->
    <td>
        <form method="get" action="{% url 'update_start_time' %}">
            <input type="hidden" name="workout_id" value="{{ product.id }}">
            <input type="submit" class="btn" value="Start Time" name="start_time">
        </form>
    </td>
</tr>
{% endfor %}
  • 修改index_2视图,根据ID更新指定记录:
from django.shortcuts import get_object_or_404
from datetime import datetime

def index_2(request):
    if request.GET.get('start_time'):
        workout_id = request.GET.get('workout_id')
        if workout_id:
            time = datetime.now().strftime('%H:%M:%S')
            # 定位到指定记录并更新
            workout = get_object_or_404(WorkOut, id=workout_id)
            workout.start = time
            workout.save()

    # 需传入form,否则页面上方的输入表单会报错
    form = WorkOutForm()
    products = WorkOut.objects.all()
    context = {'products': products, 'form': form}
    return render(request, 'myapp/index.html', context)

3. 建议改用POST方法处理数据修改

GET请求不适合用来修改服务器数据(不符合HTTP规范),容易被缓存或误触发。

优化:

  • 模板表单改为POST方法并添加CSRF令牌:
<td>
    <form method="post" action="{% url 'update_start_time' %}">
        {% csrf_token %}
        <input type="hidden" name="workout_id" value="{{ product.id }}">
        <input type="submit" class="btn" value="Start Time" name="start_time">
    </form>
</td>
  • 视图改为处理POST请求:
def index_2(request):
    if request.method == 'POST' and 'start_time' in request.POST:
        workout_id = request.POST.get('workout_id')
        if workout_id:
            time = datetime.now().strftime('%H:%M:%S')
            workout = get_object_or_404(WorkOut, id=workout_id)
            workout.start = time
            workout.save()

    form = WorkOutForm()
    products = WorkOut.objects.all()
    context = {'products': products, 'form': form}
    return render(request, 'myapp/index.html', context)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:05:34