And*_*ron 6 django django-forms
我有一个Django表单,它将向一个数据库添加一个条目,其中一个列具有唯一约束.如果提交尝试创建重复,我得到一个django.db.utls.IntegrityError声明我违反了唯一约束(谢天谢地).
处理Django表单时,有许多方法可以验证:
clean方法clean_<field>方法如果clear_<field>方法引发a django.forms.ValidationError,则错误消息将附加到_errors字段名称下的字典中的列表中.使用该clean方法时,应将错误手动插入到_errorsdict中.
现在,clean和clean_<field>方法听起来不是放置有副作用的代码的好地方,我担心此时检查值是否唯一并不能保证我不会得到IntegrityErrors.我宁愿尝试在数据库中创建行,并在违反约束时发出表单错误信号.
我的主要问题是,形式公开公共属性errors这是只读的.因此,根据文档,我应该在我的表单中添加一个完成所有工作的方法,尝试插入数据库并在IntegrityError引发时注册错误.因为验证后处理表单的操作需要大量其他数据,所以我不想将代码放在表单类本身中.
是否还有其他(有记录的或有记录的)方法可以errors在课堂外的dict中添加一个条目,或者我应该只是访问_errors"私有"变量并对此感到满意?我知道这听起来像是一个OOP漏洞,但创建一个额外的方法只是为了访问这个"私有"变量在我看来似乎并不像任何人屏蔽任何东西.
编辑:
似乎其他人已经提出了类似的问题,但似乎答案指向手动插入_errors...
目前,一个简单的解决方案如下:
try:
# Try to save model instance, which might throw `IntegrityError`.
# ...
except django.db.utils.IntegrityError:
# The form passed validation so it has no errors.
# Use the `setdefault` function just in case.
errors = django.forms.util.ErrorList()
errors = form._errors.setdefault(
django.forms.forms.NON_FIELD_ERRORS, errors)
errors.append('Sorry, this username is already in use.')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2719 次 |
| 最近记录: |