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
相关产品推荐
相关产品推荐

