models.UniqueConstraint提交表单未触发错误,如何添加字段提示?
解决Django联合唯一约束无错误提示的问题
方案一:在表单中手动校验联合唯一性(推荐)
在forms.py的KeyDefinitionForm类中添加clean方法,手动检查key_name和developer_email的组合是否已存在,若存在则给key_name字段绑定错误提示:
from django.core.exceptions import ValidationError from .models import KeyDefinition class KeyDefinitionForm(BSModalModelForm): ## 原有代码... def clean(self): cleaned_data = super().clean() key_name = cleaned_data.get('key_name') developer_email = cleaned_data.get('developer_email') # 仅当两个字段均有值时执行校验 if key_name and developer_email: if KeyDefinition.objects.filter( key_name=key_name, developer_email=developer_email ).exists(): self.add_error('key_name', 'Key Name已存在') return cleaned_data def save(self): log.debug("ENTER: forms.KeyDefinitionForm.save") if self.request: instance = super(CreateUpdateAjaxMixin, self).save() log.debug("EXIT: forms.KeyDefinitionForm.save") return instance
方案二:在视图中捕获数据库完整性错误
如果不想在表单层做校验,也可以在视图的post方法中捕获保存时抛出的IntegrityError,并将错误绑定到key_name字段:
首先在views.py中导入异常类:
from django.db import IntegrityError
然后修改post方法:
def post(self, request, *args, **kwargs) : log.debug("ENTER: views.KeyDefinitionView.post()") form = self.form_class(request.POST) if form.is_valid(): try: form.save() # 保存成功后执行父类的post逻辑 return super().post(request, args, kwargs) except IntegrityError: # 给key_name字段添加重复错误提示 form.add_error('key_name', 'Key Name已存在') # 表单无效或捕获到错误时,返回带错误的表单页面 data = {'form': form} result = render(request, self.template_name, data) log.debug("EXIT: views.KeyDefinitionView.post()") return result
额外修复:完善模型的clean方法
你的模型clean方法未调用父类的clean方法,可能导致内置校验逻辑失效,建议补充:
def clean (self) : super().clean() # 必须调用父类clean方法 import logging log = logging.getLogger("app") log.debug("the clean function") regex = '^[0-9]+\.[0-9]+$' if re.search(regex, self.version) is None: raise ValidationError ( {'version' : ['Version number is invalid. Use format major.minor']} )
内容的提问来源于stack exchange,提问作者Sorath
相关产品推荐
相关产品推荐

