Django实现BMI计算的表单输入校验与错误提示实现求助
实现方案
你可以通过Django自带的表单类封装所有校验逻辑,直接使用内置的is_valid()方法完成校验,不需要手动编写大量类型判断、数值判断的if else语句,符合你的需求。
步骤1:新增forms.py文件,定义校验表单类
所有校验规则全部封装在这个表单类中:
from django import forms class BMICalcForm(forms.Form): # 姓名字段:字符串类型,必填 name = forms.CharField( label="姓名", error_messages={"required": "请输入姓名"} ) # 体重:整数,最小为1,自动校验非负、输入是否为整数 weight = forms.IntegerField( label="体重(磅)", min_value=1, error_messages={ "required": "请输入体重", "invalid": "体重必须为整数", "min_value": "体重不能小于1磅" } ) # 身高英寸:整数,最小0,最大11(超过12英寸可自动换算为英尺) heightinches = forms.IntegerField( label="身高(英寸)", min_value=0, max_value=11, error_messages={ "required": "请输入身高英寸值", "invalid": "英寸必须为整数", "min_value": "英寸不能为负数", "max_value": "英寸最大为11,超过部分请换算为英尺" } ) # 身高英尺:整数,最小1,避免总身高为0导致计算报错 heightfeet = forms.IntegerField( label="身高(英尺)", min_value=1, error_messages={ "required": "请输入身高英尺值", "invalid": "英尺必须为整数", "min_value": "英尺不能小于1" } ) # 可选增强校验:防止总身高为0 def clean(self): cleaned_data = super().clean() hf = cleaned_data.get("heightfeet") hi = cleaned_data.get("heightinches") if hf and hi and hf * 12 + hi <= 0: raise forms.ValidationError("总身高不能为0") return cleaned_data
步骤2:修改views.py逻辑,调用校验方法
from django.shortcuts import render from django.views import View # 导入上面编写的表单类 from .forms import BMICalcForm class Home(View): def get(self, request): # 实例化空表单传给模板 form = BMICalcForm() return render(request, 'home.html', {"form": form}) def post(self, request): # 把用户提交的POST数据传入表单 form = BMICalcForm(request.POST) # 调用is_valid()触发所有校验逻辑,返回布尔值表示是否校验通过 if form.is_valid(): # 校验通过,取经过清洗的合法数据计算BMI data = form.cleaned_data n = data["name"] w = data["weight"] hi = data["heightinches"] hf = data["heightfeet"] h = hf * 12 + hi bmi = (703 * w) / (h * h) return render(request, 'response.html', { "name":n, "heightinches":hi, "heightfeet":hf, "weight":w, "height":h, "bmi":bmi }) else: # 校验不通过,把携带错误信息的表单传回首页,给用户提示 return render(request, 'home.html', {"form": form})
步骤3:修改home.html,展示错误提示
校验不通过时会在对应字段下方显示错误提示,用户不需要重新填写已经正确的内容:
{% load static %} <html> <head><title>Home</title></head> <body> <h1>Hello Repl.it</h1> <form action="" method="post"> {% csrf_token %} <!-- 姓名字段 --> <div> {{ form.name.label }}: {{ form.name }} {% for error in form.name.errors %} <span style="color:red;">{{ error }}</span> {% endfor %} </div> <br> <!-- 体重字段 --> <div> {{ form.weight.label }}: {{ form.weight }} 磅 {% for error in form.weight.errors %} <span style="color:red;">{{ error }}</span> {% endfor %} </div> <br> <!-- 身高英尺字段 --> <div> {{ form.heightfeet.label }}: {{ form.heightfeet }} 英尺 {% for error in form.heightfeet.errors %} <span style="color:red;">{{ error }}</span> {% endfor %} </div> <br> <!-- 身高英寸字段 --> <div> {{ form.heightinches.label }}: {{ form.heightinches }} 英寸 {% for error in form.heightinches.errors %} <span style="color:red;">{{ error }}</span> {% endfor %} </div> <br> <!-- 显示全局校验错误 --> {% for error in form.non_field_errors %} <div style="color:red;">{{ error }}</div> <br> {% endfor %} <input type="submit"/> </form> </body> </html>
response.html不需要修改,保持原有代码即可正常使用。
内容的提问来源于stack exchange,提问作者monkeyduo
相关产品推荐
相关产品推荐

