cla*_*tte 5 python mysql django validation django-models
如果我尝试在Django 1.10中保存不完整的模型实例,我会期望Django引发错误.似乎并非如此.
models.py:
from django.db import models
class Essai(models.Model):
ch1 = models.CharField(max_length=100, blank=False)
ch2 = models.CharField(max_length=100, blank=False)
Run Code Online (Sandbox Code Playgroud)
所以我有两个字段不允许为空(默认行为,NOT NULLDjango在MySQL表创建时应用了限制).我希望Django在存储之前没有设置其中一个字段时会出错.
但是,当我创建一个不完整的实例时,数据存储得很好:
>>> from test.models import Essai
>>> bouh = Essai()
>>> bouh.ch1 = "some content for ch1"
>>> bouh.save()
>>> bouh.id
9
>>> bouh.ch1
'some content for ch1'
>>> bouh.ch2
''
>>>
Run Code Online (Sandbox Code Playgroud)
我原本以为Django会引发错误.但是,如果我强制ch2使用None,则会引发错误:
>>> bouh = Essai()
>>> bouh.ch1 = "some content for ch1"
>>> bouh.ch2 = None
>>> bouh.save()
Traceback (most recent call last):
(...)
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: test_essai.ch2
>>> bouh.id
>>> bouh.ch1
'some content for ch1'
>>> bouh.ch2
>>>
Run Code Online (Sandbox Code Playgroud)
说明:在这个简单的情况下,Django没有引发错误作为默认行为,因为在SQL中空字符串""不等于NULL,如Django模型中所述,blank = False不起作用?
现在,如果我们看看ModelForm行为,django doc似乎存在不一致:
根据:http: //psocdddang目录
Django将阻止任何保存不完整模型的尝试,因此如果模型不允许缺少的字段为空,并且不为缺少的字段提供默认值,则任何尝试保存()具有缺少字段的ModelForm都将失败.要避免此失败,必须使用缺少但必填字段的初始值来实例化模型:(...)
如果没有默认值,则不应使用缺少的字段保存modelForm.
因此,使用此ModelForm:
生成
class EssaiModelForm(forms.ModelForm):
class Meta:
model = Essai
fields = ['ch1']
仅包含一个字段的表单ch1.
ch1保留为空,则验证EssaiModelFormInstance.is_valid()将按预期失败.ch1包含值,则验证成功,即使ch2仍然缺失.然后EssaiModelFormInstance.save()成功,与django文档中声称的相反.ch2是空字符串,因此与SQL要求兼容(NOT NULL).所以似乎""Charfield 的默认默认值空字符串在表单验证中不被接受,但在save()验证中被接受.这可能需要在文档中进行说明.
由于您的情况始终需要这两个字段ch1和ch2,因此您所需要做的就是修改您的模型,以便
from django.db import models
class Essai(models.Model):
ch1 = models.CharField(max_length=100)
ch2 = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)
并将表单中的字段包含为
class EssaiModelForm(forms.ModelForm):
class Meta:
model = Essai
fields = ['ch1', 'ch2']
Run Code Online (Sandbox Code Playgroud)
Django 将自动引发此字段的验证错误is_valid()
或者如果您想禁止向这些字段输入空字符串blank=False将不起作用
请参阅此Django - 如何设置空白= False,必需= False