【发布时间】:2020-09-30 10:31:11
【问题描述】:
我正在制作一个烧瓶网站,其中有一个 SQLite 数据库,其中有一个名为 mainscreen 的表。在我的主屏幕上,我有一些从主屏幕 - 内容列中获取的文本。我正在尝试从我的表单中的 textarea 中检索数据,该表单应该更新我的主屏幕表。虽然我正确地被重定向到我的 home.html,但我看不到正在做的更改,即我的表没有得到更新。
MainScreen 表结构
|- mainscreen
|- id = integer - primary key
|- content = varchar(1000)
所需代码
flaskapp.py
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)
myproject / __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}>'
loggedin.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>
home.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 的方式上可能犯了一些错误,所以我添加了更多与我的初始化相关的代码。谢谢,感谢您的帮助
【问题讨论】:
-
如果你只是说它不起作用,就不可能猜到哪里出了问题。你必须自己调试它。看看你在 python 中有什么值,你传递给模板的确切内容以及你在模板中看到的内容。然后,您应该向我们提供相关信息,而不是您的完整申请。
-
@zvone 我已经提供了相关代码。出了什么问题是我的数据库没有得到更新。我尝试了几个建议,实际上我的最后一行正确执行,这意味着我的数据库更新语句没有任何错误。但是我的数据库由于某种原因没有改变
-
嗯,首先,您提供的代码中没有数据库更新。至少我看不到。其次,尚不清楚问题是仅在模板中,还是在python代码中。这可以通过调试发现。
-
@zvone
new_content = request.form.get('home', False) mainContent = MainScreen.query.get(1) mainContent.content = new_content db.session.commit()是更新查询。我试过调试它,但找不到问题,因此我把它带到了 SO
标签: python python-3.x flask sqlalchemy flask-sqlalchemy