【问题标题】:ValueError - The Hydrant could not be created because the data didn't validateValueError - 无法创建消火栓,因为数据未验证
【发布时间】:2013-06-12 00:48:43
【问题描述】:

我正在尝试使用 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 和 Address 对象——有没有简单的解决方法?)。但是,一旦我在表单上输入数据并单击提交,我就会得到:

ValueError 在 /structures/hydrants/create/

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

我浏览了 StackOverflow,但其他人遇到的主要问题是将新对象的创建和现有对象的修改分开(我有两个视图来处理这个问题,并且“编辑”视图运行相同问题在同一个地方。

谢谢!

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    您需要在form.save() 之前调用form.is_valid()。这将确保提交的表单包含模型所需的所有数据。如果表单验证失败,它将向您的用户显示问题所在。 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})
    

    【讨论】:

    • 嗨,斯科特,感谢您的快速回复。我把它放进去,它告诉我一个带有选定 Gpscoord 和选定地址的消火栓已经存在。我对 Hydrant 和这两个模型有一对一的关系,但是有没有办法可以在同一个 Hydrant 创建页面上创建 GPSCoord 和地址?我记得使用内联在管理界面上这样做。
    • 如果您的Hydrant 表中需要多个gpscoord 和地址,那么这些字段可能应该切换到models.ForeignKey
    • 对不起,如果我不清楚。它们应该是一对一的,但我希望能够在消火栓创建视图上创建新的 gpscoords 和新地址。
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2011-07-18
    • 2013-09-18
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多