提交含预填充与手动输入数据的表单时数据库无数据问题
问题分析与修复方案
你的表单提交后数据库无数据,主要是以下几个问题导致的:
1. 表单类继承错误
你写的LogForm继承了forms.Form,但同时又使用了Meta类绑定模型——这是矛盾的。forms.Form是普通表单类,不需要Meta配置;和模型绑定的表单应该用forms.ModelForm。这个错误会导致表单验证逻辑异常,甚至无法正确获取清理后的数据。
修正后的LogForm:
from django import forms from .models import Log from django.core.validators import MinValueValidator class LogForm(forms.ModelForm): log_workout = forms.CharField() log_repetitions = forms.IntegerField(validators=[MinValueValidator(1)]) class Meta: model = Log fields = ['log_workout', 'log_repetitions']
2. 视图中workout_id赋值错误
视图里的data.workout_id = Workout.pk完全错误:Workout是模型类,不是具体的实例,Workout.pk只是模型的主键字段定义,不是实际的ID值。你需要用传入的pk参数直接赋值给workout_id(假设Log模型里有workout外键字段)。
同时用form.save(commit=False)比手动创建Log实例更简洁,也能避免手动赋值遗漏:
def addlog(request, pk): url = request.META.get('HTTP_REFERER') if request.method == 'POST': form = LogForm(request.POST) if form.is_valid(): data = form.save(commit=False) data.workout_id = pk data.save() return HttpResponseRedirect(url) # 表单验证失败时返回原页面,携带错误信息 workout = Workout.objects.get(pk=pk) return render(request, '对应模板路径.html', {'workout': workout, 'form': LogForm()})
3. 模板输入字段类型缺失
log_repetitions是IntegerField,但模板里的input没有指定type="number",浏览器会默认按字符串提交,容易触发表单验证失败(比如用户输入非数字内容)。
修正后的模板代码:
<form class="review-form" action="{% url 'my_gym:addlog' workout.id %}" method="post"> {% csrf_token %} <input hidden type="text" name="log_workout" value="{{ object.name }}" required id="id_log_workout"> <input type="number" name="log_repetitions" required id="id_log_repetitions"> <button type="submit">提交</button> </form>
4. 视图未处理验证失败场景
原来的视图只要表单验证不通过就直接跳转,你无法看到具体错误信息。修正后的逻辑会返回原页面并携带表单错误,方便排查问题。
内容的提问来源于stack exchange,提问作者A_K
相关产品推荐
相关产品推荐

