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

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

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

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

Flask

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

Python

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

Q&A

解決済

1回答

1138閲覧

Pythonのdatetimeモジュールについて

asasika_R

総合スコア25

DateTime

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

Flask

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

Python

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

0グッド

0クリップ

投稿2022/06/27 05:54

flaskを用いて家計簿のようなものを作成しようとしたのですが、datetimeモジュールが思うように動きません。

プログラミング言語はpython,アプリケーションを作るためにflaskを使用し、データベース操作のために
pythonのormであるflask-sqlalchemyを使っています。

アプリケーションの概要ですが、まず、日用品や交際費などのようにジャンル別にカテゴリーを作成し、カテゴリーごとの予算を設定します。お金を使うごとに何にお金をどれくらい使ったかを記録し、それらの情報をウェブページ上に載せるというものです。なお一番下にpythonのコードすべてを載せています。
(HTMLは割愛)

datetimeを用いて、お金を使った日をデータとして保存し、ウェブ上に表示させたいのですが、日付が変わると自動的に時間が更新され、すべての日付がウェブページを開いた日に変わってしまいます。
日付をデータベースに追加した日のまま固定する方法はありますでしょうか。

python

1from flask import Flask 2from flask import render_template,redirect,request 3from flask_sqlalchemy import SQLAlchemy 4from flask_migrate import Migrate 5import datetime 6 7app = Flask(__name__) 8app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db' 9app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 10db = SQLAlchemy(app) 11migrate = Migrate(app,db) 12 13today = datetime.date.today() 14 15class Category(db.Model): 16 name = db.Column(db.String,db.ForeignKey('detail.id'),primary_key=True) 17 budget = db.Column(db.Integer,nullable=False) 18 remaining_budget = db.Column(db.Integer,nullable=False) 19 month = db.Column(db.Integer,nullable=False) 20 21class Detail(db.Model): 22 id = db.Column(db.Integer,primary_key=True) 23 name = db.relationship('Category',backref='detail',lazy=True) 24 used_money = db.Column(db.Integer,nullable=False) 25 purchased_item = db.Column(db.String,nullable=False) 26 month = db.Column(db.Integer,nullable=False) 27 date = db.Column(db.String,nullable=False) 28 29@app.route('/') 30def index(): 31 print(today.month) 32 display_categorys = Category.query.filter_by(month = 6).all() 33 display_details = Detail.query.filter_by(month = 6).all() 34 index_month = today.month 35 index_day = today.day 36 return render_template('index.html',categorys=display_categorys,details=display_details,this_month=index_month,day=index_day) 37 38 39@app.route('/create_category' ,methods=['GET','POST']) 40def create_category(): 41 if request.method == 'GET': 42 return render_template('create_category.html') 43 else: 44 category_name = request.form.get('category_name') 45 budget = request.form.get('budget') 46 category_month = today.month 47 add_category = Category(name=category_name,budget=budget,remaining_budget=budget,month=category_month) 48 db.session.add(add_category) 49 db.session.commit() 50 return redirect('/') 51 52@app.route('/<string:category_name>/create_detail/' ,methods=['GET','POST']) 53def create_detail(category_name): 54 check_category = Category.query.filter_by(name=category_name).first() 55 if request.method == 'GET': 56 return render_template('create_detail.html',category=check_category) 57 else: 58 purchased_item = request.form.get('purchased_item') 59 used_money = int(request.form.get('used_money')) 60 check_category.remaining_budget -=used_money 61 detail_day = today.day 62 detail_month = today.month 63 add_detail = Detail(purchased_item=purchased_item,used_money=used_money,date=detail_day,month=detail_month) 64 db.session.add(add_detail) 65 db.session.commit() 66 return redirect('/')

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

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

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

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

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

guest

回答1

0

ベストアンサー

実行して確認したわけではありませんが、いたるところでtoday = datetime.date.today()todayを使い回しているのが原因だと思います。

htmlが不明なので推測ですが、登録した日付ではなく、その日(当日)の日付が出てしまうといっているのは、以下の部分(/でアクセスしたページで見た場合)じゃないでしょうか?(閲覧がこれだけな気がするので)

python

1 2@app.route('/') 3def index(): 4 print(today.month) 5 display_categorys = Category.query.filter_by(month = 6).all() 6 display_details = Detail.query.filter_by(month = 6).all() 7 index_month = today.month 8 index_day = today.day 9 return render_template('index.html',categorys=display_categorys,details=display_details,this_month=index_month,day=index_day) 10

index_monthindex_dayを見てください。
これにはtodayの値が入っています。
DBの値を参照していません。
DBの値を参照するように変更してみてください。

ついでに

dbの方ですが、月をinteger、dayが無く、dateをStringで持とうとしているように見えます。(dateはmonthとは別なんだろうか?date=detail_dayとあるのでdateは実はday?)
わかりづらい上に使いにくい気がするので、DateTime型やDate型など、日付が扱える型で保存した方が楽だと思います。
取得したデータは対応した型で取得できるので、intやstringで持つよりも使いやすいです。

ついでに2

本題と関係無いですが、サーバで実行した場合、このtodayは意図したdatetime.date.today()の値が入っているか不明ですので使うのをやめた方が良いです。

投稿2022/06/27 09:02

FiroProchainezo

総合スコア2401

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

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

asasika_R

2022/06/28 07:41

的確なアドバイスありがとうございます。問題が解決しただけでなく、知らなかったことも知れました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問