首页 > 解决方案 > 为什么我的 Flask-SQLAlchemy 更新查询不会更改我的表格内容

问题描述

我正在制作一个烧瓶网站,其中有一个 SQLite 数据库,其中有一个名为 mainscreen 的表。在我的主屏幕上,我有一些从主屏幕 - 内容列中获取的文本。我正在尝试从我的表单中的 textarea 中检索数据,该表单应该更新我的主屏幕表。虽然我正确地被重定向到我的 home.html,但我看不到我的更改,即我的表没有更新。


MainScreen 表结构


|- mainscreen
    |- id = integer - primary key
    |- content = varchar(1000)

所需代码


烧瓶应用程序

from flask import Flask, render_template, [...]
from flask_login import [...]
from myproject.__init__ import User, MainScreen
from werkzeug.security import generate_password_hash,check_password_hash
from flask_sqlalchemy import SQLAlchemy
import os

app = Flask(__name__)


app.config['SECRET_KEY'] = [...]
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.abspath(os.path.join(os.path.dirname( __file__ ), 'data.sqlite'))

db = SQLAlchemy(app)

@app.route('/updated', methods=['POST', 'GET'])
def change_home():
    if request.method == 'GET':
        new_content = request.form.get('home', False)
        mainContent = MainScreen.query.get(1)
        mainContent.content = new_content
        db.session.commit()
        return redirect(url_for('home'))

    else:
        return redirect(url_for('login'))


@app.route('/loggedin', methods=['POST', 'GET'])
def login():
    [... ...]
    datas = {}
    datas['content'] = onlycontent
    return render_template('loggedin.html', data=datas)

我的项目 / __init __.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import [...]
from flask_login import UserMixin
import os

app = Flask(__name__)
db = SQLAlchemy(app)


app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.abspath(os.path.join(os.path.dirname( __file__ ), os.pardir, 'data.sqlite'))


class MainScreen(db.Model, UserMixin):

    __tablename__ = 'mainscreen'

    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.String(1000), unique=False, nullable=False)

    def __init__(self, id, content):
        self.id = id
        self.content = content

    def __repr__(self):
        return f'<MainScreen {self.id} {self.content}>'

登录.html

    <form action="{{url_for('change_home')}}" method="get">
        <table>
            <tr>
                <td width="10%">
                    <h4>Home Page</h4>
                </td>

                <td class="padding-right:5%">
                    <textarea name="home" rows="7">{{data['content']}}</textarea>
                </td>
                <td>
                    <input type="submit" class="btn btn-primary"></input>
                </td>
            </tr>
        </table>    
    </form>

主页.html

@app.route('/home')
@app.route('/')
def home():
    datas = {}
    MainContent = MainScreen.query.get(1)
    content = MainContent.content
    datas['aboutme'] = content
    return render_template('home.html', data=datas)

点冻结

Flask==1.1.2
Flask-Login==0.5.0
Flask-Migrate==2.5.3
Flask-SQLAlchemy==2.4.4
SQLAlchemy==1.3.19
SQLAlchemy-Utils==0.33.2

更新 1


设置一些断点后,我的变量似乎new_content没有获取数据。它返回None。由于我的内容列设置为 NOT NULL,这可能是它没有得到更新的原因。我需要弄清楚为什么我的new_content变量没有检索数据


更新 2


看来我的变量mainContent.content现在正在更新 - 我必须通过添加home双引号来检索数据。现在我的db.session.commit()似乎没有工作。从一些在线研究中,我发现我在初始化 flask-sqlalchemy 的方式上可能犯了一些错误,所以我添加了更多与我的初始化相关的代码。谢谢,感谢您的帮助

标签: pythonpython-3.xflasksqlalchemyflask-sqlalchemy

解决方案


这可能是因为您正在发送数据GET- 试试看request.args.get("home")是否有效。


推荐阅读