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

AJAX无刷新提交数据失败:未写入数据库且URL出现GET参数求助

问题排查:AJAX提交Todo数据失败,URL变为GET参数形式

问题现象

点击提交按钮后,数据未写入数据库,URL变为http://127.0.0.1:5000/?description=New+to+do+statement+4,说明表单触发了默认的GET提交逻辑,AJAX功能未生效。

错误点及修复方案

1. 阻止表单默认提交的语法错误

JavaScript中e.preventDefault():末尾误用冒号,应为分号。该错误会导致代码中断,无法阻止表单默认提交行为,直接触发GET请求跳转。

2. 输入框ID缺失

HTML中输入框的id属性为空,document.getElementById('description')无法获取输入值,导致AJAX提交内容为空,后端接收失败。需给输入框添加id="description"。

3. JavaScript变量拼写与DOM元素缺失

  • console.log(jsonresponse)中变量名拼写错误,应为jsonResponse(大小写不一致);
  • 页面中的<ul>没有id="todo",document.getElementById('todo').appendChild(liItem)无法找到目标列表,新Todo无法添加到页面。需给<ul>添加id="todo"。

4. Flask后端潜在问题

  • db.create_all()需要在Flask应用上下文内执行,否则可能无法创建数据库表;
  • 建议开启SQLALCHEMY_TRACK_MODIFICATIONS = False避免框架警告。

修正后的代码

HTML与JavaScript代码

<html>
    <head>
        <title>Todo App</title>
        <style>
        .hidden{
            display:none;
        }</style>
    </head>
    <body>

        <form id="form">
            <!-- 补充输入框ID -->
            <input type="text" name="description" id="description">
            <input type="submit" value="Create">
        </form>

        <div id="error" class="hidden">Something went wrong</div>
        <!-- 给列表添加ID -->
        <ul id="todo">
            {% for d in data %}
                <li>{{d.description}}</li>
            {% endfor %}    
        </ul>

        <script>
            document.getElementById('form').onsubmit = function (e) {
                // 修正阻止默认行为的语法
                e.preventDefault();
                fetch('/todo/create', {
                    method: 'POST',
                    body: JSON.stringify({
                        'description': document.getElementById('description').value
                    }),
                    headers: {
                        'Content-Type' : 'application/json'
                    }
                })
                .then(function(response) {
                    return response.json();
                })
                .then(function(jsonResponse){
                    // 修正变量名拼写
                    console.log(jsonResponse);
                    const liItem= document.createElement('LI');
                    liItem.innerHTML = jsonResponse['description'];
                    document.getElementById('todo').appendChild(liItem);
                    document.getElementById('error').className='hidden';
                })

                .catch(function(){
                    document.getElementById('error').className = '';
                })
            }
        </script>
    </body>
</html>

Python(Flask)后端代码

from flask import Flask, render_template, request, redirect, url_for, jsonify
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:MassRay12@localhost:5432/todoapp'
# 开启配置避免框架警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

class Todo(db.Model):
    __tablename__ = 'todo'
    id = db.Column(db.Integer, primary_key=True)
    description = db.Column(db.String(), nullable=False)

    def __repr__(self):
        return f'<Todo {self.id} {self.description}>'

# 在应用上下文内创建数据库表
with app.app_context():
    db.create_all()

@app.route('/todo/create', methods=['POST'])
def create_todo():
    description = request.get_json()['description']
    todo = Todo(description=description)
    db.session.add(todo)
    db.session.commit()
    return jsonify({
        'description': todo.description
    })

@app.route('/')
def index():
    return render_template('index.html', data = Todo.query.all())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:57:18