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

提交含预填充与手动输入数据的表单时数据库无数据问题

问题分析与修复方案

你的表单提交后数据库无数据,主要是以下几个问题导致的:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:51:33