Django - 无法验证 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'], ['3'], 'sim_range_concent'], 'sim_range2concent':

如果我使用 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 数据被打印出来(并且它是正确的(在上面的块引用中输出)),但我的数据库中仍然没有任何内容。

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

编辑:

表格.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')

模型.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 SimForm(forms.ModelForm):
    class Meta:
        model = Sim
        fields = ('sim_concentration_range','sim_concentration_range_2','sim_concentration_range_unit')

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

- 从 views.py 中删除了 save_sim_data 函数,并在其 html 中删除了表单的操作声明

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

B. 奥巴

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

class SimForm(forms.ModelForm):

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章