我正在尝试使用ModelForm来创建对象并将其保存到我的数据库,但是我一直收到一个ValueError,告诉我一旦提交POST数据,我的数据就不会被验证。
这是在models.py
中class Hydrant(models.Model):
gpscoord = models.OneToOneField(GPSCoord)
address = models.OneToOneField(Address)
size = models.DecimalField(max_digits=10, decimal_places=3)
def __unicode__(self):
return '(' + str(self.gpscoord.latitude) + ', ' + str(self.gpscoord.longitude) + ')'
class HydrantForm(ModelForm):
class Meta:
model = Hydrant
这是在views.py
中def hydrant_create(request):
if request.method == 'POST':
form = HydrantForm(request.POST)
new_hydrant = form.save() #it breaks here
return HttpResponseRedirect(reverse('hydrant_detail', args=(new_hydrant.id,)))
else:
form = HydrantForm() #unbound form
return render(request, 'structures/hydrant_create.html', {'form': form})
这是hydrant_create.html
<h3> Creating Hydrant</h3>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="{% url 'hydrant_create' %}" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
在'structures / hydrants / create',我的html模板看起来很好(虽然我只能选择已经创建的GPSCoord和地址对象 - 这是否有一个简单的解决方法?)。一旦我输入表格上的数据并点击提交,我就明白了:
我在StackOverflow中进行了搜索,但其他人遇到的主要问题是将新对象的创建与现有对象的修改分开(我有两个视图来处理这个问题,而“编辑”视图也是如此)问题在同一个地方。
谢谢!
答案 0 :(得分:1)
您需要在form.is_valid()
之前致电form.save()
。这将确保提交的表单包含模型的所有必需数据。如果表单验证失败,它将向您的用户显示错误。 Check out the documentation for further information.
def hydrant_create(request):
if request.method == 'POST':
form = HydrantForm(request.POST)
if form.is_valid():
new_hydrant = form.save() #it breaks here
return HttpResponseRedirect(reverse('hydrant_detail', args=(new_hydrant.id,)))
else:
form = HydrantForm() #unbound form
return render(request, 'structures/hydrant_create.html', {'form': form})