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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:06:05