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

Django提交表单报错ValueError: invalid literal for int() with base 10如何解决?

解决 ValueError at /add invalid literal for int() with base 10 错误

嘿,这个错误我之前踩过坑!本质是你直接把表单提交的字符串用int()强制转成整数,但完全没做输入校验——要是用户输入了字母、符号,甚至空着输入框就提交,int()肯定会抛出这个报错。结合你的代码,我给你两种靠谱的修复方案:

问题根源拆解

先看你views.py里的add函数:

val1 = int(request.POST ['num1'])
val2 = int(request.POST ['num2'])

这里默认了用户输入的一定是纯整数,但实际场景中用户可能输错,或者没输入就点提交,这时候request.POST.get('num1')拿到的是空字符串或者非数字字符串,int()转不动就会报错。

修复方案1:手动加校验和异常处理(快速解决)

在转换前先检查输入是否合法,或者用try-except捕获异常,给用户明确的提示:

from django.shortcuts import render, redirect
from django.http import HttpResponse

def home(request):
    return render(request, 'home.html', {'name':'Noah'})

def add(request):
    if request.method == 'POST':
        # 先拿到输入内容,默认空字符串避免KeyError
        num1 = request.POST.get('num1', '')
        num2 = request.POST.get('num2', '')
        
        # 检查是不是纯整数(注意:这种方法不支持负数,如果需要负数可以改判断逻辑)
        if not num1.isdigit() or not num2.isdigit():
            # 输入不合法,返回首页并提示错误
            return render(request, 'home.html', {
                'name':'Noah',
                'error': '兄弟,得输入有效的整数啊!'
            })
        
        # 没问题再转换计算
        val1 = int(num1)
        val2 = int(num2)
        res = val1 + val2
        return render(request, 'result.html', {'result':res})
    # 如果是GET请求直接重定向回首页,避免用户直接访问/add路径
    return redirect('home')

然后在home.html里加上错误提示的展示,让用户知道哪里错了:

{% extends 'base.html' %}
{% block content %}
<h1>hello {{name}}!!!!</h1>
<!-- 显示错误提示 -->
{% if error %}
<p style="color: red; font-weight: bold;">{{ error }}</p>
{% endif %}
<form action="/add/" method="POST"> <!-- 建议用绝对路径,避免路径问题 -->
    {% csrf_token %}
    Enter 1st number: <input type="text" name="num1">
    Enter 2nd number: <input type="text" name="num2">
    <input type="submit">
</form>
{% endblock %}

修复方案2:用Django表单(更专业规范)

如果想长期维护更方便,推荐用Django自带的Form类来做输入校验,它会自动处理各种异常情况,还能生成自带错误提示的表单:

  1. 先在你的app里新建forms.py文件:
from django import forms

class AddForm(forms.Form):
    num1 = forms.IntegerField(label='Enter 1st number')
    num2 = forms.IntegerField(label='Enter 2nd number')
  1. 修改views.py,用表单来处理输入:
from django.shortcuts import render, redirect
from .forms import AddForm  # 导入刚才写的表单

def home(request):
    form = AddForm()  # 初始化空表单
    return render(request, 'home.html', {'name':'Noah', 'form': form})

def add(request):
    if request.method == 'POST':
        form = AddForm(request.POST)  # 用POST数据填充表单
        if form.is_valid():  # Django自动做校验
            # 校验通过后拿清理好的整数数据
            val1 = form.cleaned_data['num1']
            val2 = form.cleaned_data['num2']
            res = val1 + val2
            return render(request, 'result.html', {'result':res})
        # 校验失败,返回首页并显示表单自带的错误提示
        return render(request, 'home.html', {'name':'Noah', 'form': form})
    # GET请求重定向回首页
    return redirect('home')
  1. 最后修改home.html,用Django表单渲染输入框:
{% extends 'base.html' %}
{% block content %}
<h1>hello {{name}}!!!!</h1>
<form action="/add/" method="POST">
    {% csrf_token %}
    {{ form.as_p }}  <!-- 自动渲染带标签和错误提示的输入框 -->
    <input type="submit">
</form>
{% endblock %}

这样用户输入非整数时,表单会自动在输入框下面显示错误提示,比如“Enter a whole number”,不用自己写一堆校验逻辑。

额外小提醒

  • 表单的action最好用绝对路径(比如/add/),避免页面嵌套时路径出错,导致POST数据没传到后端。
  • 测试的时候可以故意输点奇怪的内容(比如abc、12.5、空值),看看错误提示是不是正常显示,确保修复生效。

内容的提问来源于stack exchange,提问作者Noah P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:12:31