Django - 无法验证 ModelForm

Django - Trouble validating ModelForm

def io_simulation(request):
    form = SimForm(request.POST)
    print('FIRST' + str(request.POST))
    if form.is_valid():
        form.save()

    return render(request, 'App/simulation.html', {'title': 'Simulation'})

此视图函数显示我的 POST 数据已正确发送,但未到达我的数据库。这是打印语句的输出:

FIRST<QueryDict: {'csrfmiddlewaretoken': ['dzowQoB3lk2IOOc19QXQDPZ3soJaxglaP76cURfjB6GMU3VBkHDe7IDhIp2CPpyK'], 'sim_concentration_range': ['3'], 'sim_concentration_range_2': ['4'], 'sim_concentration_range_unit': ['ppm']}>

如果我使用 io_simulation 作为提交表单的操作,则会收到 NoReverseMatch 错误,并且不会打印出我的 POST 数据。如果我将此其他功能用作操作:

def save_sim_data(request):
    if request.method == 'POST':
        request.POST.get('sim_concentration_range')
        request.POST.get('sim_concentration_range_2')
        request.POST.get('sim_concentration_range_unit')
        data=Sim()
        data.sim_concentration_range = request.POST.get('sim_concentration_range')
        data.sim_concentration_range_2 = request.POST.get('sim_concentration_range_2')
        data.sim_concentration_range_unit = request.POST.get('sim_concentration_range_unit')
        data.save()

        return render(request, 'nowhere.html')  

else:
    return render(request,'no/errors.html')

然后我确实看到我的 POST 数据被打印出来了(而且它是正确的(在上面的 blockquote 中输出)),但我的数据库中仍然没有任何结果。

我无法理解视图结构和调试。怎么回事?

编辑:

Forms.py:

class SimForm(forms.ModelForm):
    sim_concentration_range = forms.DecimalField()
    sim_concentration_range_2 = forms.DecimalField()
    sim_concentration_range_unit = forms.ChoiceField()

    class Meta:
        model = Sim
        fields = ('sim_concentration_range','sim_concentration_range_2','sim_concentration_range_unit')

models.py

class Sim(models.Model):
    sim_concentration_range = models.DecimalField(max_digits = 100, decimal_places = 5, default=1)
    sim_concentration_range_2 = models.DecimalField(max_digits = 100, decimal_places = 5, default=1)
    sim_concentration_range_unit = models.TextChoices('sim_cc_unit', 'ppm ')

解决步骤

- 删除 forms.py SimForm 函数内但 Meta class

之外的变量定义
class SimForm(forms.ModelForm):
    class Meta:
        model = Sim
        fields = ('sim_concentration_range','sim_concentration_range_2','sim_concentration_range_unit')

- 将 models.py Sim class 中的 TextChoices 字段更改为 CharField

- 从 views.py 中删除了 save_sim_data 函数并删除了其 html

中表单的操作声明

- 更改了 URL 模式以使用 io_simulation 视图

因为您使用的是 ModelForm,所以您不必覆盖这些字段。所以你可以这样输入:

class SimForm(forms.ModelForm):

    class Meta:
        model = Sim
        fields = ('sim_concentration_range','sim_concentration_range_2','sim_concentration_range_unit')