Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:检查用户是否在表单中添加了新实例?_Python_Django_Models - Fatal编程技术网

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

Python Django:检查用户是否在表单中添加了新实例?,python,django,models,Python,Django,Models,我有一个表单,我正在渲染它。如果列表中不存在新实例,它还允许用户添加新实例。 假设该字段为namefromcategorymodal name是一个下拉列表,如果用户在列表中找不到他的值,他将name写入下一个输入框 当我验证它时,它失败了。因为它不是类别的实例。 然后我用self.data得到它,然后比较它是整数还是非整数 如果它是一个整数,而不是一个简单的现有元素,如果不是,用户可能已经选择了一个新用户,因此通过从self.data获取它,我可以创建 类别 对象并保存它,然后用ID替换原始值

我有一个表单,我正在渲染它。如果列表中不存在新实例,它还允许用户添加新实例。 假设该字段为
name
from
category
modal

name
是一个下拉列表,如果用户在列表中找不到他的值,他将
name
写入下一个输入框

当我验证它时,它失败了。因为它不是
类别的实例。
然后我用self.data得到它,然后比较它是整数还是非整数

如果它是一个整数,而不是一个简单的现有元素,如果不是,用户可能已经选择了一个新用户,因此通过从
self.data
获取它,我可以创建
类别

对象并保存它,然后用ID替换原始值,以便验证不会失败

问题

我知道使用
self.data
并将其用于db查询可能会很危险。因为用户可以在其中输入任何内容,并且它可能会用该查询清空我的数据库(我听到过这样的说法)。这真的有可能吗?如果是,如何避免


希望有人能给我一个想法

假设您的表单有一个用于现有类别名称的
名称
字段和一个用于输入框的
新名称
字段。在表单的
clean()
方法中,您需要检查
self.cleaned\u data
是否有
new\u name
的值,并相应地执行操作。你可以这样做:

self.cleaned_data['name'] = self.cleaned_data['new_name']
比如说

除非重写其他字段或表单方法,否则就恶意输入而言,这些字段中的数据是“安全的”。如果在表单的
clean()
方法中引发
ValidationError
is\u valid()
将返回false。所以,只要你:

form = YourForm(...)
if form.is_valid():
    form.save()

将不会使用无效数据调用
save()

您应该在表单的clean()方法中执行此验证/赋值。如果您发布表单类的相关部分,我可以告诉您clean()方法应该做什么。@DavidM当我们从表单下拉列表中发送正确的值时,我肯定会在
self.cleaned_data
下的clean方法中得到该值,但是如果用户在下拉列表中找不到该值并单击“添加新”怎么办?此时会出现文本框,用户写入值并与表单一起提交。现在在clean中,我不是在
self.cleaned_data
中得到这个值,而是在
self.clean
中得到这个值。我担心,如果我从self.clean中获得值,那么如果某个可疑用户在数据库中输入了危险的字符串,我可能会结束我们对数据库的混乱。这可能吗?我已经添加了一个答案。这有帮助吗?我完全相信你想说的话。当用户在文本框中输入下一个值时,它具有相同的字段名。i、 e.
名称
。因此,清除的_数据不包含文本名称字段,因为它是前面带有category的key。我可以从self.data访问此值,但清除的数据没有此值。已清除的数据只有从验证传递的值。我担心如果用户输入和我从self.data获得的输入是恶意的:(我猜你使用的是同一个“名称”属性。如果这是真的,我建议您不要这样做,而是为文本字段使用一个具有不同名称的新字段。如果您发布表单类定义,我可以向您展示在那里执行的操作。好的,我将尝试使用不同的字段。但是如何确保用户没有输入一些恶意的输入中的字符串?通常,如果您使用的是Django表单的预期使用方式,那么您是非常安全的。这里不适合提供更多详细信息,但Django有很好的文档。如果您想确定,请发布您的代码(可能在新问题中)并提问。