前言
数据库db_ab
表tbl_authors、tbl_books
flask补充:id默认情况,从1开始,自动增长
代码(app.py)
# -*- coding:utf-8 -*-
from flask import Flask, render_template, url_for, request, redirect
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
class Config(object):
"""配置参数"""
# sqlalchemy的配置参数
SQLALCHEMY_DATABASE_URI = "mysql://root:[email protected]:3306/db_ab"
# 设置sqlalchemy自动跟踪数据库
SQLALCHEMY_TRACE_MODIFICATIONS = True
# 设置秘钥
SECRET_KEY = "ABCDEFG1234567"
app.config.from_object(Config) # 配置参数
db = SQLAlchemy(app)
# 数据库模型
class Author(db.Model):
"""作者"""
__tablename__ = "tbl_authors" # 数据库中的表名
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32))
books = db.relationship("Book", backref="author") # 方便查询
"""
在author_book.html中使用方便查询
<ul>
{% for author in authors %}
<li>作者:{{ author.name }}</li>
<ul>
{% for book in author.books %}
<li>书籍:{{book.name}}
<a href="/delete_book?book_id={{book.id}}">删除</a>
</li>
{% endfor %}
</ul>
{% endfor %}
</ul>
"""
class Book(db.Model):
"""书籍"""
__tablename__ = "tbl_books"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
author_id = db.Column(db.Integer, db.ForeignKey("tbl_authors.id"))
# 表单模型
class AuthorBookForm(Form):
"""表单模型"""
author_name = StringField(label=u"作者", validators=[DataRequired(u"作者不能为空!")])
book_name = StringField(label=u"书籍", validators=[DataRequired(u"书籍不能为空!")])
submit = SubmitField(label=u"保存")
@app.route("/", methods=["GET", "POST"])
def index():
# 提交表单数据
form = AuthorBookForm() # 表单对象实例
if form.validate_on_submit():
# 表单数据通过验证
# 获取表单数据
author_name = form.author_name.data
book_name = form.book_name.data
# 保存到数据库
author = Author(name=author_name)
db.session.add(author)
db.session.commit()
book = Book(name=book_name, author_id=author.id)
db.session.add(book)
db.session.commit()
# 查询作者,返回列表
author_li = Author.query.all()
return render_template("author_book.html", authors=author_li, form=form)
@app.route("/delete_book", methods=["GET"])
def delete_book(): # 删除书籍
# 获取参数
book_id = request.args.get("book_id")
# 删除数据
book = Book.query.get(book_id)
db.session.delete(book)
db.session.commit()
return redirect(url_for("index"))
def testdata(): # 测试数据
db.drop_all()
db.create_all()
author1 = Author(name="吴承恩")
author2 = Author(name="曹雪芹")
author3 = Author(name="罗贯中")
author4 = Author(name="施耐庵")
author5 = Author(name="孔子")
db.session.add_all([author1, author2, author3, author4, author5])
db.session.commit()
book1 = Book(name="西游记", author_id=author1.id)
book2 = Book(name="红楼梦", author_id=author2.id)
book3 = Book(name="三国演义", author_id=author3.id)
book4 = Book(name="水浒传", author_id=author4.id)
book5 = Book(name="论语", author_id=author5.id)
book6 = Book(name="春秋", author_id=author5.id)
db.session.add_all([book1, book2, book3, book4, book5, book6])
db.session.commit()
if __name__ == "__main__":
testdata()
app.run(debug=True)
代码(author_book.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="POST">
{{ form.csrf_token }}
{{ form.author_name.label }}:
<p>{{form.author_name}}
{% for msg in form.author_name.errors %}
{{msg}}
{% endfor %}</p>
{{ form.book_name.label }}:
<p>{{form.book_name}}
{% for msg in form.book_name.errors %}
{{msg}}
{% endfor %}</p>
<p>{{ form.submit }}</p>
</form>
<hr/>
<ul>
{% for author in authors %}
<li>作者:{{ author.name }}</li>
<ul>
{% for book in author.books %}
<li>书籍:{{book.name}}
<a href="/delete_book?book_id={{book.id}}">删除</a>
</li>
{% endfor %}
</ul>
{% endfor %}
</ul>
</body>
</html>
测试
数据库模型及初始化数据
开始测试
测试后