You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:06:36