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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:21:13