import sqlite3
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
sqlite_path = 'db/todo.db'
def get_db_connection():
connection = sqlite3.connect(sqlite_path)
connection.row_factory = sqlite3.Row
return connection
@app.route("/")
def index():
connection = get_db_connection()
cursor = connection.cursor()
res = cursor.execute('SELECT * FROM todo')
return render_template('index.html', todo_list=res.fetchall())
@app.route("/add", methods=["GET", "POST"])
def add_task():
if request.method == "GET":
todo = {}
return render_template("edit.html", todo=todo)
else:
connection = get_db_connection()
cursor = connection.cursor()
error = []
if not request.form["name"]:
error.append("タスク名を入力してください。")
if not request.form["duedate"]:
error.append("期日を入力してください。")
if error:
todo = request.form.to_dict()
return render_template("edit.html", todo=todo,error_list=error)
cursor.execute("INSERT INTO todo(name, duedate, memo) VALUES(?, ?, ?)",
(request.form["name"],
request.form["duedate"],
request.form["memo"]))
connection.commit()
return redirect(url_for("index"))
@app.route("/delete/<int:id>")
def delete(id):
connection = get_db_connection()
cursor = connection.cursor()
cursor.execute("DELETE FROM todo WHERE id = ?", (id,))
connection.commit()
return redirect(url_for("index"))
不明点
①todoの新規作成は辞書で、エラーはリストを返しているがなぜ違うのか
→todoは名前と項目という2つ表示させるので辞書を使っている
リストはエラーを表示させるだけなのでリストだけで事足りる。もしくはエラーが1つだけならリストに文字列を入れて表示させればいいが、エラーの表示が複数あるので、空のリストを作成して条件分岐でappendでエラーを表示させている
②エラーの表示はリストで作成しているが、print()ではだめなのか
printはコンソールに表示させるだけの関数で、フロントには表示できないんだそう。
フロントに表示させるには変数で渡す必要がある
だからリストや辞書を作成して、変数に入れてフロントに渡している
printも変数に入れて渡せるかもしれないが、リストを使うほうがのちのち追加することも考えるといいのかも