Django:如何检查用户是否在表单中添加了新实例?
我有一个表单,用户可以在上面填写信息。如果列表里没有他们想要的选项,用户还可以添加一个新的选项。比如说,这个字段是来自 category
模块的 name
。
name
是一个下拉列表,如果用户在列表中找不到自己想要的值,他们可以在下一个输入框里直接写这个 name
。
当我进行验证时,发现验证失败了,因为这个值并不是 category
的一个实例。然后我用 self.data
来检查这个值,看看它是不是一个整数。
如果是整数,那说明这个值是一个已经存在的元素;如果不是,用户可能选择了一个新的用户。通过 self.data
,我可以创建一个新的 category
对象,并保存它,然后用这个新对象的ID来替换原来的值,这样验证就不会失败了。
问题来了。
我知道使用 self.data
来进行数据库查询可能会有风险。因为用户可以在里面输入任何东西,这可能会导致我的数据库被清空(我听说过这种情况)。这真的有可能吗?如果是的话,应该怎么避免呢?
希望有人能给我一些建议。
1 个回答
1
假设你的表单里有一个 name
字段,用来填写已有的分类名称,还有一个 new_name
字段,用于输入新的名称。在你表单的 clean()
方法里,你需要检查一下 self.cleaned_data
中是否有 new_name
的值,并根据这个值进行相应的处理。你可能会这样做:
self.cleaned_data['name'] = self.cleaned_data['new_name']
举个例子。
除非你重写了其他字段或表单的方法,否则这些字段里的数据在防止恶意输入方面是“安全”的。如果你在表单的 clean()
方法中抛出一个 ValidationError
,那么 is_valid()
方法会返回 false。所以,只要你:
form = YourForm(...)
if form.is_valid():
form.save()
就不会用无效的数据来调用 save()
方法。