Django:如何检查用户是否在表单中添加了新实例?

0 投票
1 回答
613 浏览
提问于 2025-04-17 23:49

我有一个表单,用户可以在上面填写信息。如果列表里没有他们想要的选项,用户还可以添加一个新的选项。比如说,这个字段是来自 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() 方法。

撰写回答