Django开发计算器报name 'c' is not defined错误解决方案
报错根因
你遇到的name 'c' is not defined错误触发逻辑非常明确:
首次访问页面时浏览器发送的是GET请求,你所有给变量
c赋值的代码全写在if request.method=='POST'的分支块内,GET请求根本不会执行这些赋值逻辑。等到后面构造context字典时直接引用c,这个变量根本没被创建,自然抛出未定义的错误。
额外提两个代码里的隐藏问题:
- 用
global c,a,b声明全局变量存计算结果是严重的设计错误:Django服务是进程常驻的,全局变量会被所有访问用户共享,会出现A用户的计算结果显示在B用户页面上的串数据问题,这个场景下完全没必要用全局变量。 - 除法分支判断除数为0的逻辑
int(b) + 0 == 0是无效冗余写法,直接判断int(b) == 0即可。
修复步骤
- 在POST判断逻辑之前初始化
c的默认值(比如设为空字符串),保证GET请求访问时变量已定义 - 删除全局变量声明,所有计算变量都用视图函数内的局部变量,避免多用户数据串扰
- 修正冗余的除零判断逻辑
修复后的views.py代码
from django.shortcuts import render from django.template import loader from django.http import HttpResponse # Create your views here. def indx(request): template = loader.get_template('calculator/calc_home.html') # 初始化c的默认值,GET请求时默认不显示计算结果 c = "" if request.method=='POST': a = request.POST.get('num1') b = request.POST.get('num2') option = request.POST.get('select_val') if not a or not b : c = 'please select 2 numbers' else: if option == 'add': c = int(a) + int(b) elif option == 'multiply': c = int(a) * int(b) elif option == 'substract': c = int(a) - int(b) elif option == 'devide': # 移除冗余的+0判断 if int(b) == 0: c = 'infinity' else: c = int(a) / int(b) else: c = 'please choose an option' context = { 'sum': c, } return HttpResponse(template.render(context, request))
可选体验优化
原HTML里输入框的value属性写死了num_1、num_2字符串,用户打开页面时输入框会直接显示这两个无意义的文本,建议改成空值,用placeholder做输入提示:
<label for="num_1">enter 1st number:</label> <input type="number" name="num1" placeholder="输入第一个数字"><br> <label for="num_2">enter 2nd number:</label> <input type="number" name="num2" placeholder="输入第二个数字"><br>
内容的提问来源于stack exchange,提问作者HARRSH BERMANN
相关产品推荐
相关产品推荐

