Django注册系统:如何验证用户输入的年龄为纯数字?
问题分析
你的年龄验证失效是因为布尔值与字符串直接比较:age.isnumeric()返回的是Python布尔类型的True或False,但你却把它和字符串"False"做相等判断——这永远不会成立,所以错误提示永远不会触发。
顺带一提,用户名的判断逻辑也存在同样的潜在问题:username.isnumeric() == "True"也是布尔值和字符串比较,只是你测试时没暴露出来而已。
修复代码
修改views.py里的判断逻辑,直接使用布尔值进行判断:
def Registration(request): if request.method == "POST": username = request.POST["username"] age = request.POST["age"] ... # 修正用户名判断:直接用布尔值 if username.isnumeric(): messages.error(request, "Username can't be all number!") return redirect("/") # 修正年龄判断:检查是否非数字 if not age.isnumeric(): messages.error(request, "Age must be all numbers!") return redirect("/") ... messages.success(request, "Your account has been succesfully created") return redirect("/Login/") return render(request, "Registration.html")
额外优化建议
- 前端输入限制:把年龄输入框的
type="text"改成type="number",浏览器会自动限制用户输入数字,减少后端验证压力:<input class="" type="number" id="age" name="age" placeholder="Enter your age" Required> - 空值防护:即使前端有
Required约束,后端也可以先检查输入是否为空,再验证格式:if not age or not age.isnumeric(): messages.error(request, "Age must be all numbers!") return redirect("/") - 年龄范围校验:可以额外添加合理的年龄范围判断,比如限制在13-120岁之间:
if not age.isnumeric(): messages.error(request, "Age must be all numbers!") return redirect("/") age_num = int(age) if age_num < 13 or age_num > 120: messages.error(request, "Age must be between 13 and 120!") return redirect("/")
内容的提问来源于stack exchange,提问作者Lubomir.kunc
相关产品推荐
相关产品推荐

