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

Django表单设置:实现hi/bye字段二选一必填

实现Django表单「至少填一个字段」的校验方法

嘿,这个需求很实用,咱们可以通过自定义表单校验逻辑轻松实现,具体分两步来做:

第一步:关闭字段的默认必填校验

默认情况下Django的CharField是required=True的,会先拦截空提交,所以得先把两个字段的必填开关关掉:

class MeForm(forms.Form):
    hi = forms.CharField(max_length=100, required=False)
    by = forms.CharField(max_length=100, required=False)

第二步:重写表单的clean()方法做自定义校验

Django表单的clean()方法是全局校验的入口,咱们在这里判断两个字段是否都为空,如果是就抛出校验错误:

class MeForm(forms.Form):
    hi = forms.CharField(max_length=100, required=False)
    by = forms.CharField(max_length=100, required=False)

    def clean(self):
        cleaned_data = super().clean()
        hi_value = cleaned_data.get('hi', '')
        by_value = cleaned_data.get('by', '')
        
        # 排除只填空格的无效提交,判断是否真的都为空
        if not hi_value.strip() and not by_value.strip():
            # 两种错误提示方式二选一:
            # 方式1:全局错误(显示在表单顶部)
            raise forms.ValidationError("请至少填写「hi」或「by」中的一个字段")
            # 方式2:绑定到指定字段(显示在对应字段下方)
            # self.add_error('hi', "请至少填写「hi」或「by」中的一个字段")
        
        return cleaned_data

小细节补充:

  • 用cleaned_data.get()而非直接取cleaned_data['hi'],避免字段未提交时抛出KeyError
  • 加上.strip()是为了防止用户只输入空格就提交,这种情况咱们也视为空值
  • 两种错误提示方式可以根据页面UI需求选择,绑定到字段的方式对用户更友好

内容的提问来源于stack exchange,提问作者giveJob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:59:47