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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:24:01