質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1388閲覧

PythonのFlaskで、既存のTodoアプリにカウントダウン機能をつけたいのですが、どうしてもうまくいきません。

E.Kudo

総合スコア2

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/27 03:48

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

動作未検証ですが、エラーメッセージから推測すると
today = datetime.now()today = datetime.now().date()で解消すると思われます。

投稿2021/10/27 04:58

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

E.Kudo

2021/10/27 05:19

ありがとうございます。解決いたしました。 datetime.datetime型同士にそろえなければ時間差を求める計算はできないと解釈してたのですが、一方だけdatetime.date型でも可能ということですか?
can110

2021/10/27 05:26

いえ。型をそろえないと(どちらもdatetime.date型でないと)計算できません。
E.Kudo

2021/10/27 06:31

datetime.date型同士でも計算できるのですね。 まちがって解釈していたようです。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問