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
相关产品推荐
相关产品推荐

