这是我的模特:
class MyModel(models.Model):
s1 = models.CharField(max_length=255)
s2 = models.CharField(max_length=255)
我期待django不允许我将空字符串视为有效,因为我在文档中读到blank
和null
默认为false。例如:
python manage.py shell
>>> a = MyModel()
>>> a.s1
''
>>> a.save()
>>> a.id()
1
为什么不引发字符串为空的异常?还有,没有min_length这样的东西吗?我想将我的字段限制为至少3个字符。
答案 0 :(得分:2)
blank
是与验证相关的属性,这意味着它仅适用于通过django-admin网站输入数据或使用ModelForm
从模型派生的表单。
示例:
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
>>> f = MyForm({"s1":""})
>>> f.is_valid()
False
>>> f = MyForm({"s1":"hello world"})
>>> f.is_valid()
True
>>> a = f.save()
>>> a
<MyModel: MyModel object>
>>> a.id
10
<强> MIN_LENGTH 强>
min_length
确实存在,但作为forms.CharField
而不是models.CharField
的参数。
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
s1 = forms.CharField(min_length=3, max_length=100)
>>> f = MyForm({"s1":"12"})
>>> f.is_valid()
False
>>> f = MyForm({"s1":"1234"})
>>> f.is_valid()
True
在未指定的字段上添加例外(没有表单)
通过设置default=None
,字段默认为NULL
而不是""
,这会在手动保存模型时引发异常(除非指定null=True
)。
class MyModel(models.Model):
s1 = models.CharField(max_length=255, default=None)
>>> m = MyModel()
>>> m.save()
Traceback (most recent call last):
File "<console>", line 1, in ?
<.... trimmed for brevity ...>
File "/usr/lib/python2.3/site-packages/django/db/backends/sqlite3/base.py", line 193, in execute
return Database.Cursor.execute(self, query, params)
IntegrityError: test_mymodel.s1 may not be NULL
我只在django的旧版本上测试了这个,所以YMMV
从1.2开始,django模型带有validation built-in,这意味着您可以通过调用Model.full_clean()来触发验证功能,而无需使用ModelForm。
class MyModel(models.Model):
s1 = models.CharField(max_length=100)
def save(self, *args, **kwargs):
self.full_clean()
Super(MyModel, self).save(*args, **kwargs)
>>> m = MyModel()
>>> m.save()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/tmp/lsc/playground/zoo/models.py", line 42, in save
self.full_clean()
File "/usr/lib/pymodules/python2.6/django/db/models/base.py", line 881, in full_clean
raise ValidationError(errors)
ValidationError: {'s1': [u'This field cannot be blank.']}