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

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

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

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

SQLite

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Python

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

Q&A

解決済

1回答

329閲覧

flaskでwebアプリを作りたいのですが、どなたか教えて頂けないでしょうか?

kojirou_pon11

総合スコア1

Flask

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

SQLite

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Python

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

0グッド

0クリップ

投稿2024/02/06 05:49

編集2024/02/06 06:31

実現したいこと

入力欄にタイトル、内容、投稿日とあるのですが、それらを入力して、キチンとデータベース(sqlite)に入力されるようにしたいのです。

発生している問題・分からないこと

入力欄にタイトル、内容、投稿日とあるのですが、タイトル、内容までは入力完了して、キチンとデータも更新されるのですが、投稿日を追加したく、コードを書いたのですが、タイトル、内容、投稿日を入力しても作成・更新ボタンを押すとstatement errorが出ます。投稿日を入力し、作成ボタン・更新ボタンを押せば、レコードが更新されるようにしたいのです。私、初心者でして、提示すべき情報も出し切れていなかったり、いろいろ無理なお願いをしているかもしれませんが何とか教えて頂けないでしょうか?
よろしくお願い致します。

Eggpan様
エラーメッセージの一番上の部分でよろしいでしょうか?
StatementError
sqlalchemy.exc.StatementError: (builtins.TypeError) SQLite Date type only accepts Python date objects as input.
[SQL: INSERT INTO memos (title, content, create_at) VALUES (?, ?, ?)]
[parameters: [{'content': 'gwr', 'create_at': '2024-02-06', 'title': 'gw'}]]

該当のソースコード

python

1app.py 2from flask import Flask 3from flask_migrate import Migrate 4from models import db 5 6# ================================================== 7# Flask 8# ================================================== 9app = Flask(__name__) 10# 設定ファイル読み込み 11app.config.from_object("config.Config") 12# dbとFlaskとの紐づけ 13db.init_app(app) 14# マイグレーションとの紐づけ(Flaskとdb) 15migrate = Migrate(app, db) 16# viewsのインポート 17from views import * 18 19# ================================================== 20# 実行 21# ================================================== 22if __name__ == "__main__": 23 app.run() 24 25config.py 26# ================================================== 27# 設定 28# ================================================== 29class Config(object): 30 # デバッグモード 31 DEBUG=True 32 # 警告対策 33 SQLALCHEMY_TRACK_MODIFICATIONS = False 34 # DB設定 35 SQLALCHEMY_DATABASE_URI = "sqlite:///memodb.sqlite" 36

models.py

1from datetime import date 2from flask_sqlalchemy import SQLAlchemy 3 4# Flask-SQLAlchemyの生成 5db = SQLAlchemy() 6 7# ================================================== 8# モデル 9# ================================================== 10# メモ 11class Memo(db.Model): 12 "テスト用のモジュールです" 13 # テーブル名 14 __tablename__ = 'memos' 15 # ID(PK) 16 id = db.Column(db.Integer, primary_key=True, autoincrement=True) 17 # タイトル(NULL許可しない) 18 title = db.Column(db.String(50), nullable=False) 19 # 内容 20 content = db.Column(db.Text) 21 #投稿日 22 create_at = db.Column(db.Date)

views.py

1from flask import render_template, request, redirect, url_for 2from app import app 3from models import db, Memo 4 5# ================================================== 6# ルーティング 7# ================================================== 8# 一覧 9@app.route("/memo/") 10def index(): 11 # メモ全件取得 12 memos = Memo.query.all() 13 # 画面遷移 14 return render_template("index.html", memos=memos) 15 16# 登録 17@app.route("/memo/create", methods=["GET", "POST"]) 18def create(): 19 # POST時 20 if request.method == "POST": 21 # データ入力取得 22 title = request.form["title"] 23 content = request.form["content"] 24 create_at = request.form["create_at"] 25 # 登録処理 26 memo = Memo(title=title, content=content, create_at=create_at) 27 db.session.add(memo) 28 db.session.commit() 29 # 画面遷移 30 return redirect(url_for("index")) 31 # GET時 32 # 画面遷移 33 return render_template("create.html") 34 35# 更新 36@app.route("/memo/update/<int:memo_id>", methods=["GET", "POST"]) 37def update(memo_id): 38 "テスト用のモジュールです" 39 # データベースからmemo_idに一致するメモを取得し、 40 # 見つからない場合は404エラーを表示 41 memo = Memo.query.get_or_404(memo_id) 42 # POST時 43 if request.method == "POST": 44 # 変更処理 45 memo.title = request.form["title"] 46 memo.content = request.form["content"] 47 memo.create_at = request.form["create_at"] 48 db.session.commit() 49 # 画面遷移 50 return redirect(url_for("index")) 51 # GET時 52 # 画面遷移 53 return render_template("update.html", memo=memo) 54 55# 削除 56@app.route("/memo/delete/<int:memo_id>") 57def delete(memo_id): 58 "テスト用のモジュールです" 59 # データベースからmemo_idに一致するメモを取得し、 60 # 見つからない場合は404エラーを表示 61 memo = Memo.query.get_or_404(memo_id) 62 # 削除処理 63 db.session.delete(memo) 64 db.session.commit() 65 # 画面遷移 66 return redirect(url_for("index")) 67 68# モジュールのインポート 69from werkzeug.exceptions import NotFound 70 71# エラーハンドリング 72@app.errorhandler(NotFound) 73def show_404_page(error): 74 "テスト用のモジュールです" 75 msg = error.description 76 print('エラー内容:',msg) 77 return render_template('errors/404.html', msg=msg) , 404

base.html・index.html

1base.html 2<!DOCTYPE html> 3<html lang="ja"> 4<head> 5 <meta charset="UTF-8"> 6 <title>検査・試験依頼入力フォーム</title> 7</head> 8<body> 9 {% block content %}{% endblock %} 10</body> 11</html> 12index.html 13{% extends "base.html" %} 14 15{% block content %} 16 <h1>メモ一覧</h1> 17 <ul> 18 {% for memo in memos %} 19 <li>{{ memo.title }} - 20 <a href="{{ url_for('update', memo_id=memo.id) }}">編集</a> | 21 <a href="{{ url_for('delete', memo_id=memo.id) }}">削除</a> 22 </li> 23 {% endfor %} 24 </ul> 25 26 <a href="{{ url_for('create') }}">新しいメモを作成</a> 27{% endblock %} 28 29

create.html・update.html

1create.html 2{% extends "base.html" %} 3 4{% block content %} 5 <h1>新しいメモを作成</h1> 6 <form method="post" action="{{ url_for('create') }}"> 7 <label for="title">タイトル</label> 8 <input type="text" name="title" id="title" required> 9 <br><br> 10 <label for="content">内容</label> 11 <textarea name="content" id="content" cols="50" rows="5" required></textarea> 12 <br><br> 13 <label for="create_at">投稿日</label> 14 <input type="date" id="create_at" name="create_at" value=""> 15 <br><br> 16 <input type="submit" value="作成"> 17 </form> 18 19 <a href="{{ url_for('index') }}">戻る</a> 20{% endblock %} 21update.html 22{% extends "base.html" %} 23 24{% block content %} 25 <h1>メモを編集</h1> 26 <form method="post" action="{{ url_for('update', memo_id=memo.id) }}"> 27 <label for="title">タイトル</label> 28 <input type="text" name="title" id="title" value="{{ memo.title }}" required> 29 <br><br> 30 <label for="content">内容</label> 31 <textarea name="content" id="content" cols="50" rows="5" required>{{ memo.content }}</textarea> 32 <br><br> 33 <label for="create_at">投稿日</label> 34 <input type="date" id="create_at" name="create_at" value=""> 35 <br><br> 36 <input type="submit" value="更新"> 37 </form> 38 39 <a href="{{ url_for('index') }}">戻る</a> 40{% endblock %} 41 42

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

<ファイルとディレクトリ>
ファイル名
┣ templates ━ errors ━ 404.html
┃ ┣ base.html
┃ ┣ create.html
┃ ┣ index.html
┃ ┗ update.html
┣app.py
┣config.py
┣models.py
┗ views.py

補足

<開発環境>
windows11、Python、Flask、sqlite、sqlalchemy
まだ、python flask sqlite sqlalchemyの初級者なのでいろいろなことが分かっていません。
何とか覚えたいと考えております。皆様、ご教授願えないでしょうか?
よろしくお願い致します。

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

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

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

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

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

Eggpan

2024/02/06 06:09

> statement errorが出ます。 とのことですが、エラーメッセージを質問に追記出来ますでしょうか? 多くの場合エラーメッセージ内に原因が書かれていますので、よりよい回答がつくと思います。
melian

2024/02/06 06:39

> SQLite Date type only accepts Python date objects as input. ということなので、views.py の create_at = request.form["create_at"] を適切に変更する必要があります。
kojirou_pon11

2024/02/06 07:27

melian様、Eggpan様ありがとうございました。問題が解決しました。sqliteは型として、日付(Date)型をもっていないのですね。初歩的なことなのに気づかずにすみませんでした。そして、有難うございました。 後は、その近辺のコードをを修正したら、キチンとデータが更新されました。
kojirou_pon11

2024/02/14 03:03

コメントありがとうございます。⚪︎⚪︎を試したところ問題が解決しました! ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
kojirou_pon11

2024/02/14 03:04

コメントありがとうございます。⚪︎⚪︎を試したところ問題が解決しました! ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
kojirou_pon11

2024/02/14 03:05

melian様、Eggpan様ありがとうございました。問題が解決しました。sqliteは型として、日付(Date)型をもっていないのですね。初歩的なことなのに気づかずにすみませんでした。そして、有難うございました。 後は、その近辺のコードをを修正したら、キチンとデータが更新されました。
guest

回答1

0

自己解決

修正箇所は、3か所で→の後に書いた型に変更しました。

models.py

#投稿日
create_at = db.Column(db.Date→Text)
create.html

<label for="create_at">投稿日</label>
<input type="date→text" id="create_at" name="create_at" value="">
update.html

<label for="create_at">投稿日</label>
<input type="date→text" id="create_at" name="create_at" value="">

投稿2024/02/14 03:15

kojirou_pon11

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問