Django中如何将两个输入值传入表单content字段并实现提交展示?
解决方法:整合模型表单、处理提交并展示训练记录
作为新手遇到这种衔接问题很正常,我一步步帮你理清楚怎么做:
1. 先调整视图函数(核心逻辑)
你的模型表单WorkoutModelForm是用来操作Workout表的,但前端提交的是weight和reps两个值,所以需要在视图里把这两个值拼成句子,再塞到content字段里保存。
假设你的视图需要关联某个Exercise实例(因为Workout有外键关联它),代码可以这么写:
from django.shortcuts import render, redirect from .forms import WorkoutModelForm from .models import Exercise, Workout def workout_view(request, exercise_id): # 先拿到当前对应的训练项目(Exercise) exercise = Exercise.objects.get(id=exercise_id) # 获取该项目下的所有历史训练记录 workouts = Workout.objects.filter(exercise=exercise).order_by('-created') if request.method == 'POST': # 从表单里拿到用户输入的重量和次数 weight = request.POST.get('one') reps = request.POST.get('two') # 拼成你想要的句子格式 content_str = f"{weight} kgs completed in {reps} reps" # 用模型表单处理保存逻辑 form = WorkoutModelForm(request.POST) if form.is_valid(): # 先不直接保存到数据库,先修改字段 workout_instance = form.save(commit=False) workout_instance.content = content_str workout_instance.exercise = exercise # 关联对应的训练项目 workout_instance.save() # 重定向防止重复提交 return redirect(request.path) else: # GET请求时初始化空表单 form = WorkoutModelForm() context = { 'exercise': exercise, 'workouts': workouts, 'form': form } return render(request, '你的模板文件名.html', context)
2. 调整模板文件
你的前端加减按钮逻辑可以保留,只需要调整展示记录的部分,让它更清晰:
<form action="{% url 'workouts:workout' exercise.id %}" method="post"> {% csrf_token %} <div class="weight"> <h4>WEIGHT (kgs):</h4> <button type="button" class="weight-dec">-</button> <input type="text" value="0" class="weight-qty-box" readonly="" name="one"> <button type="button" class="weight-inc">+</button> </div> <div class="reps"> <h4>REPS:</h4> <button type="button" class="rep-dec">-</button> <input type="text" value="0" class="rep-qty-box" readonly="" name="two"> <button type="button" class="rep-inc">+</button> </div> <input type="submit" value="Save" name="submit_workout"> <input type="reset" value="Clear"> </form> <!-- 展示历史训练记录 --> <section class="past-workouts"> <h3>Your Workout History</h3> {% if workouts %} <ul> {% for w in workouts %} <li> <span>{{ w.content }}</span> <small>Logged on: {{ w.created|date:"M d, Y" }}</small> </li> {% endfor %} </ul> {% else %} <p>No workouts logged yet — add your first set to get started!</p> {% endif %} </section>
3. 补充路由配置
确保你的urls.py里的路由带exercise_id参数,这样模板里的url标签才能正确生成链接:
from django.urls import path from . import views app_name = 'workouts' urlpatterns = [ path('workout/<int:exercise_id>/', views.workout_view, name='workout'), ]
4. 可选:完善前端加减逻辑(避免负数)
如果你还没写加减按钮的JS,给你补一段基础逻辑,防止输入负数:
// 重量加减 document.querySelector('.weight-inc').addEventListener('click', () => { const input = document.querySelector('.weight-qty-box'); input.value = parseInt(input.value) + 1; }); document.querySelector('.weight-dec').addEventListener('click', () => { const input = document.querySelector('.weight-qty-box'); if (parseInt(input.value) > 0) { input.value = parseInt(input.value) - 1; } }); // 次数加减 document.querySelector('.rep-inc').addEventListener('click', () => { const input = document.querySelector('.rep-qty-box'); input.value = parseInt(input.value) + 1; }); document.querySelector('.rep-dec').addEventListener('click', () => { const input = document.querySelector('.rep-qty-box'); if (parseInt(input.value) > 0) { input.value = parseInt(input.value) - 1; } });
关键逻辑说明
- 因为你的前端表单字段(
one/two)和模型表单的字段(content)不匹配,所以需要在视图里手动拼接内容后再保存。 - 使用
form.save(commit=False)是为了先创建实例但不立即写入数据库,方便我们补充exercise外键和自定义的content值。 - 提交后重定向可以避免用户刷新页面重复提交表单的问题。
内容的提问来源于stack exchange,提问作者sgt_pepper85
相关产品推荐
相关产品推荐

