先展示一下页面:
步骤一: 添加数据库
首先是数据库的配置
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()
class Config(object):
SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@192.168.152.156:3306/author_book'
# 格式: mysql://用户名:密码@地址:端口/数据库
SQLALCHEMY_TRACK_MODIFICATION = True
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), unique=True)
book = db.relationship("Book", backref="author")
# 定义显示项
def __repr__(self):
return "Author Object: name=%s" % self.name
class Book(db.Model):
# 自定义数据表名
__tablename__ = "tbl_books"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), unique=True)
author_id = db.Column(db.Integer, db.ForeignKey("tbl_authors.id"))
# 定义显示项
def __repr__(self):
return "Book Object: name=%s" % self.name
最后创建数据库并且添加数据表
flask不会帮我们创建数据库,所以数据库需要在mysql自行创建。以下代码仅执行一次,之后注释掉即可。
if __name__ == "__main__":
# 清空原始数据库
db.drop_all()
# 添加数据表
db.create_all()
# 添加数据库内容
au_luo = Author(name="罗贯中")
au_wu = Author(name="吴承恩")
au_shi = Author(name="施耐庵")
au_cao= Author(name="曹雪芹")
db.session.add_all([au_luo, au_wu, au_shi, au_cao])
db.session.commit()
# 添加书本信息
bk_san = Book(name="三国演义", author_id=au_luo.id)
bk_xi = Book(name="西游记", author_id=au_wu.id)
bk_shui = Book(name="水浒传", author_id=au_shi.id)
bk_hong = Book(name="红楼梦", author_id=au_cao.id)
db.session.add_all([bk_san, bk_xi, bk_shui, bk_hong])
db.session.commit()
app.run(debug=True)
步骤二:创建添加的表单
from flask import Flask, render_template, request, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app.config["SECRET_KEY"] = "ashisahdoisahlfial124lohlf"
# 创建表单模型类
class AddForm(FlaskForm):
author_name = StringField("作者", validators=[DataRequired("作者必填")])
book_name = StringField("书籍", validators=[DataRequired("书名必填")])
submit = SubmitField("添加")
@app.route("/", methods=["GET", "POST"])
def index():
# 创建表单对象
form = AddForm()
return render_template("author_book.html", form=form)
表单页面 author_book.html
<form action="" method="POST">
{{ form.csrf_token() }}
<p>
{{ form.author_name.label }} :
{{ form.author_name }}
{% for error in form.author_name.errors %}
<p>{{ error }}</p>
{% endfor %}
</p>
<p>
{{ form.book_name.label }} :
{{ form.book_name }}
{% for error in form.book_name.errors %}
<p>{{ error }}</p>
{% endfor %}
</p>
<p>
{{ form.submit }}
</p>
</form>
步骤三: 将数据显示在首页
@app.route("/", methods=["GET", "POST"])
def index():
# 创建表单对象
form = AddForm()
# 查询数据库(不显示没有书籍的作者)
author_li = Author.query.filter(not_(Author.book==None)).all()
return render_template("author_book.html", author_li=author_li, form=form)
在首页模板添加记录
<ul>
{% for author in author_li %}
<li>作者:{{ author.name }}</li>
<ul>
{% for book in author.book %}
<li>{{ book.name }} <a href="/delete_book?book_id={{ book.id }}">删除</a></li>
{% endfor %}
</ul>
{% endfor %}
</ul>
步骤四:添加记录
# 表单验证,只有当所有表单都验证通过时,才返回True
if form.validate_on_submit():
# 验证通过,提取表单数据
author_name = form.author_name.data
book_name = form.book_name.data
# 添加数据到数据库
# 判断作者是否存在
author = Author.query.filter_by(name=author_name).first()
if author is None:
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()
步骤五: 删除书籍
# /delete_book?book_id=...
@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"))
整体代码:
book.py
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import not_
import pymysql
pymysql.install_as_MySQLdb()
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
app.config["SECRET_KEY"] = "ashisahdoisahlfial124lohlf"
class Config(object):
SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@192.168.152.156:3306/author_book'
SQLALCHEMY_TRACK_MODIFICATION = True
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), unique=True)
book = db.relationship("Book", backref="author")
# 定义显示项
def __repr__(self):
return "Author Object: name=%s" % self.name
class Book(db.Model):
# 自定义数据表名
__tablename__ = "tbl_books"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), unique=True)
author_id = db.Column(db.Integer, db.ForeignKey("tbl_authors.id"))
# 定义显示项
def __repr__(self):
return "Book Object: name=%s" % self.name
# 创建表单模型类
class AddForm(FlaskForm):
author_name = StringField("作者", validators=[DataRequired("作者必填")])
book_name = StringField("书籍", validators=[DataRequired("书名必填")])
submit = SubmitField("添加")
@app.route("/", methods=["GET", "POST"])
def index():
# 创建表单对象
form = AddForm()
# 表单验证,只有当所有表单都验证通过时,才返回True
if form.validate_on_submit():
# 验证通过,提取表单数据
author_name = form.author_name.data
book_name = form.book_name.data
# 添加数据到数据库
# 判断作者是否存在
author = Author.query.filter_by(name=author_name).first()
if author is None:
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.filter(not_(Author.book==None)).all()
return render_template("author_book.html", author_li=author_li, form=form)
# /delete_book?book_id=...
@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"))
author_book.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>author_book</title>
</head>
<body>
<form action="" method="POST">
{{ form.csrf_token() }}
<p>
{{ form.author_name.label }} :
{{ form.author_name }}
{% for error in form.author_name.errors %}
<p>{{ error }}</p>
{% endfor %}
</p>
<p>
{{ form.book_name.label }} :
{{ form.book_name }}
{% for error in form.book_name.errors %}
<p>{{ error }}</p>
{% endfor %}
</p>
<p>
{{ form.submit }}
</p>
</form>
<ul>
{% for author in author_li %}
<li>作者:{{ author.name }}</li>
<ul>
{% for book in author.book %}
<li>{{ book.name }} <a href="/delete_book?book_id={{ book.id }}">删除</a></li>
{% endfor %}
</ul>
{% endfor %}
</ul>
</body>
</html>