我有一个要求提供电话号码的表格。我需要确保只有数字 [0-9] 保存在数据库中。
在 Django文档中它说:
保存时会发生什么?
3) 为数据库准备数据。要求每个字段以可以写入数据库的数据类型提供其当前值。
这是怎么发生的?或者更具体地说,我如何确保已清洁?我知道我可以重写模型保存方法,但似乎有更好的方法,我只是不知道该怎么做。
我想我可以为它写一个自定义字段,但这似乎有点过分了。
另外,我意识到我可以将验证放在表单上,但感觉就像剥离了模型上的字符。
我有一个要求提供电话号码的表格。我需要确保只有数字 [0-9] 保存在数据库中。
在 Django文档中它说:
保存时会发生什么?
3) 为数据库准备数据。要求每个字段以可以写入数据库的数据类型提供其当前值。
这是怎么发生的?或者更具体地说,我如何确保已清洁?我知道我可以重写模型保存方法,但似乎有更好的方法,我只是不知道该怎么做。
我想我可以为它写一个自定义字段,但这似乎有点过分了。
另外,我意识到我可以将验证放在表单上,但感觉就像剥离了模型上的字符。
您关于第 3 点的具体问题与 django 使用该术语的方式中的“清洁”略有不同。
3) 为数据库准备数据。要求每个字段以可以写入数据库的数据类型提供其当前值。
第 3 点是关于将 python 对象值转换为适合数据库的值。具体来说,这是在Field.get_prep_value
和Field.get_db_prep_value
相反,to_python
它采用 DB 值并将其转换为 python 对象。
至于确保只存储数字 0-9,这将在Field
sclean
方法(子类 IntegerField)、formclean
方法、formclean_FIELDNAME
方法或 model中完成clean
。
您可以将自定义表单清理方法添加到您的对象模型 - 看看这篇文章https://docs.djangoproject.com/en/dev/ref/forms/validation/#form-field-default-cleaning
查看“清理特定字段属性”
下面是您可能正在寻找的一个快速示例,MyModel
包含电话号码字段的模型在哪里,我tel
在这里命名它。
import re
class MyForm(ModelForm):
class Meta:
model = MyModel
def clean_tel(self):
tel = self.cleaned_data.get('tel', '') # this is from user input
# use regular expression to check if tel contains only digits; you might wanna enhance the regular expression to restrict the tel number to have certain number of digits.
result = re.match(r'\d+', tel)
if result:
return tel # tel is clean so return it
else:
raise ValidationError("Phone number contains invalid character.")