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')
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')