1

我有一个要求提供电话号码的表格。我需要确保只有数字 [0-9] 保存在数据库中。

在 Django文档中它说:

保存时会发生什么?

3) 为数据库准备数据。要求每个字段以可以写入数据库的数据类型提供其当前值。

这是怎么发生的?或者更具体地说,我如何确保已清洁?我知道我可以重写模型保存方法,但似乎有更好的方法,我只是不知道该怎么做。

我想我可以为它写一个自定义字段,但这似乎有点过分了。

另外,我意识到我可以将验证放在表单上,​​但感觉就像剥离了模型上的字符。

4

3 回答 3

2

您关于第 3 点的具体问题与 django 使用该术语的方式中的“清洁”略有不同。

3) 为数据库准备数据。要求每个字段以可以写入数据库的数据类型提供其当前值。

第 3 点是关于将 python 对象值转换为适合数据库的值。具体来说,这是在Field.get_prep_valueField.get_db_prep_value

https://docs.djangoproject.com/en/dev/howto/custom-model-fields/#django.db.models.Field.get_prep_value

相反,to_python它采用 DB 值并将其转换为 python 对象。

至于确保只存储数字 0-9,这将在Fieldsclean方法(子类 IntegerField)、formclean方法、formclean_FIELDNAME方法或 model中完成clean

于 2012-04-27T23:44:02.370 回答
1

您可以将自定义表单清理方法添加到您的对象模型 - 看看这篇文章https://docs.djangoproject.com/en/dev/ref/forms/validation/#form-field-default-cleaning

查看“清理特定字段属性”

于 2012-04-27T23:29:31.140 回答
0

使用django模型表单+自定义表单字段清理

下面是您可能正在寻找的一个快速示例,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.") 
于 2012-04-27T23:34:17.747 回答