如何在Django模型中实现question字段禁止输入整数的验证?
Django question字段禁止纯整数内容的正确实现方案
Django CharField默认没有内置纯数字校验逻辑,需要手动添加自定义验证规则,以下是两种可落地的实现方式:
方案1:模型层全局验证(推荐)
该方案的验证规则会在所有操作该模型的场景生效,包括ModelForm、后台管理、直接调用模型save方法,避免遗漏。
首先在models.py中添加自定义验证器,修改后的代码如下:
from django.db import models from django.core.exceptions import ValidationError # 自定义验证器:判断值是否为纯数字 def validate_not_all_digits(value): # 先去除前后空格再判断,避免带空格的纯数字绕过校验 if value and value.strip().isdigit(): raise ValidationError("问题内容不能为纯数字") class Question(models.Model): # 给question字段添加validators参数绑定验证器 question = models.CharField(max_length=200, null=True, validators=[validate_not_all_digits]) option1 = models.CharField(max_length=200, null=True) option2 = models.CharField(max_length=200, null=True) option3 = models.CharField(max_length=200, null=True) option4 = models.CharField(max_length=200, null=True) answer = models.CharField(max_length=200, null=True) def __str__(self): return self.question
注意:如果是直接调用模型save()方法而不是通过ModelForm保存,需要在save前手动调用模型的full_clean()方法触发验证,ModelForm调用is_valid()时会自动触发该验证。
方案2:表单层单独验证
如果仅需要在当前QuestionForm提交时生效,不需要全局校验,可以直接在表单类中添加字段清洗方法:
修改你的forms.py代码,添加clean_question方法:
from django import forms from .models import Question from django.core.exceptions import ValidationError class QuestionForm(forms.ModelForm): class Meta: model = Question fields = "__all__" # 或你指定的字段列表 # 字段专属清洗方法,格式为clean_<字段名> def clean_question(self): question = self.cleaned_data.get("question") if question and question.strip().isdigit(): raise ValidationError("问题内容不能为纯数字") # 必须返回清洗后的值 return question
验证生效校验
修改完成后提交纯数字内容的问题,表单is_valid()会返回False,前端页面会显示对应的错误提示,你的视图逻辑不需要做任何修改即可适配。
内容的提问来源于stack exchange,提问作者Tanveer
相关产品推荐
相关产品推荐

