Pythonのflaskを使って、既存のTodoアプリのコードをアレンジして、今日から当日までのカウントダウンの機能をつけた記念日アプリを作成しようとしています。
SQLiteから日付を取り出して、今日からその日までの時間差を表示させたいと思ってるのですが、その実装中に以下のエラーが発生しました。
発生している問題・エラーメッセージ
TypeError: unsupported operand type(s) for -: 'datetime.date' and ‘datetime.datetime'
該当のソースコード
app.py
from datetime import datetime,date,time,timezone,timedelta
import pytz
from flask import Flask,render_template,request,redirect
from flask_sqlalchemy import SQLAlchemy
JST = timezone(timedelta(hours=9))
app = Flask(name,static_folder='./templates/images')
app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///todo.db'
db = SQLAlchemy(app)
class Post(db.Model):
id = db.Column(db.Integer,primary_key=True)
title = db.Column(db.String(30),nullable=False)
due = db.Column(db.DateTime,nullable=False)
img_pass = db.Column(db.Integer)
@app.route('/',methods=['GET','POST'])
def index():
if request.method == 'GET':
posts = Post.query.all()
today = datetime.now()
return render_template('index.html',posts=posts,today=today) else: title = request.form.get('title') due = request.form.get('due') #####due= datetime.combine(due, time()) #####due=pytz.timezone('Asia/Tokyo').localize(due) due = datetime.strptime(due,'%Y-%m-%d') img_pass = request.form.get('img_pass') new_post = Post(title=title,due=due,img_pass=img_pass db.session.add(new_post) db.session.commit() return redirect('/')
@app.route('/create')
def create():
return render_template('create.html')
@app.route('/delete/int:id')
def delete(id):
post = Post.query.get(id)
db.session.delete(post) db.session.commit() return redirect('/')
if name=='main':
app.run(debug=True)
create.html
{% extends 'base.html' %}
{% block body %}
<form action="/" method="POST"> <label for="title">Title</label> <input type="text" name="title"> <label for="due">Due</label> <input type="date" name="due" required> <label for="img_pass">ImagePass</label> <input type="text" name="img_pass"> <input type="submit" value="Create"> </form> {% endblock %}index.html
{% extends 'base.html' %}
{% block body %}
<h1>トップページ</h1> {% for post in posts %} <h2>タイトル:{{ post.title}}</h2> <p>日にち:{{ post.due.date() }}<br></p>あと{{ post.due.date()-today}}
<img src="images/{{ post.img_pass}}" width="150px"> <a href="delete/{{ post.id }}" role="button">Delete</a>{% endfor %}
{% endblock %}
試したこと
sqliteから取り出したdueを、datetime.datetime型に変換させようといろいろと試みたんですが、ことごとくエラーが返ってきます。
補足情報(FW/ツールのバージョンなど)
Python3.9.7 Flask2.0.2 Jinja2==3.0.2 Flask-SQLAlchemy==2.5.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/27 05:19
2021/10/27 05:26
2021/10/27 06:31