Django猜数字功能报错:'<'不支持NoneType与int实例比较
解决Django猜数字游戏中的
'<' not supported between instances of 'NoneType' and 'int'错误 这个错误的核心是**guess变量为None,却和整数类型的rand_num做大小比较**,同时代码还存在Web请求逻辑适配错误,具体问题和修复方案如下:
1. 核心错误原因
- 首次访问页面时,用户还没提交猜测内容,
request.GET.get('guessed_number')会返回None,直接拿它和整数rand_num做大小比较就触发类型错误。 - 即使拿到用户输入的
guess,它默认是字符串类型,和整数rand_num比较也会有类型不匹配问题。 - 视图里的循环逻辑完全错误:Django视图函数每次HTTP请求只会执行一次,循环无法实现多次猜测的逻辑,这是照搬了命令行版本的代码,不适合Web请求模型。
2. 完整修复代码
修正后的views.py
import random from django.shortcuts import render def easy(request): # 用Session保存游戏状态,避免每次请求重置 if 'rand_num' not in request.session: lst = range(1, 101) # 可根据需求调整数字范围 rand_num = random.choice(lst) request.session['rand_num'] = rand_num request.session['attempts'] = 10 # 初始10次尝试机会 else: rand_num = request.session['rand_num'] attempts = request.session['attempts'] context = {'attempts': request.session.get('attempts', 10)} guess = request.GET.get('guessed_number') if guess: try: guess = int(guess) if guess == rand_num: context['message1'] = f"You got it! The answer was {rand_num}" # 猜对后清除Session,重置游戏 del request.session['rand_num'] del request.session['attempts'] elif guess < rand_num: attempts -= 1 if attempts == 0: context['message'] = f"Game over! The number was {rand_num}" del request.session['rand_num'] del request.session['attempts'] else: context['message2_a'] = "Too Low" context['message2_b'] = "Guess again" request.session['attempts'] = attempts elif guess > rand_num: attempts -= 1 if attempts == 0: context['message'] = f"Game over! The number was {rand_num}" del request.session['rand_num'] del request.session['attempts'] else: context['message3_a'] = "Too High" context['message3_b'] = "Guess again" request.session['attempts'] = attempts context['guess'] = guess context['rand_num'] = rand_num except ValueError: # 处理用户输入非数字的情况 context['message'] = "Please enter a valid number!" return render(request, 'easy.html', context)
修正后的模板(easy.html)
<!-- 新增表单用于提交猜测 --> <form method="get"> <input type="number" name="guessed_number" placeholder="Enter your guess"> <button type="submit">Guess</button> </form> {% if message %} <h1>{{ message }}</h1> {% endif %} {% if guess == rand_num %} <h1>{{ message1 }}</h1> {% elif guess > rand_num %} <h1>{{ message3_a }}</h1> <h1>{{ message3_b }}</h1> {% elif guess < rand_num %} <h1>{{ message2_a }}</h1> <h1>{{ message2_b }}</h1> {% endif %} <p>Remaining attempts: {{ attempts }}</p>
关键修复说明
- 用Django的
Session保存随机数和剩余尝试次数,因为每次HTTP请求都是独立的,局部变量无法跨请求保存状态。 - 对
guess做非空判断和整数转换,彻底避免None或字符串与整数比较的类型错误。 - 增加异常处理,应对用户输入非数字的情况。
- 猜对或用完尝试次数后清除Session,实现游戏重置。
内容的提问来源于stack exchange,提问作者Shoaib Hasan
相关产品推荐
相关产品推荐

