ValueError - 无法创建Hydrant,因为数据未验证

时间:2013-06-12 00:48:44

标签: django django-forms

我正在尝试使用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和地址对象 - 这是否有一个简单的解决方法?)。一旦我输入表格上的数据并点击提交,我就明白了:

/ structures / hydrants / create /

中的ValueError

无法创建消防栓,因为数据未验证。

我在StackOverflow中进行了搜索,但其他人遇到的主要问题是将新对象的创建与现有对象的修改分开(我有两个视图来处理这个问题,而“编辑”视图也是如此)问题在同一个地方。

谢谢!

1 个答案:

答案 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})