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

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

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

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

SQLite

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

481閲覧

Flask DBから情報の取得・ブラウザへの表示ができない

退会済みユーザー

退会済みユーザー

総合スコア0

Flask

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

SQLite

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/01/14 10:47

編集2023/01/14 12:00

app.py内のdef detail():で選択した記事のIDを取得し、記事の詳細を表示させる処理を記載していますが、
どうも、IDが取得できておらず、記事詳細が、index.htmlに表示されない状態です。

エラーは無く、ブラウザで記事を選択すると、一応、アドレスバーのURLには、記事のIDは表示されております。
(画像参照 = 4の部分が記事のID)
イメージ説明
しかし、app.py内でPrint(id)は、Noneと表示されてしまっています。

どこが間違っているのか見当がつかない状況です。
アドバイス・改善策をご教示いただければと思います。

python

1# app.py 2 3from flask import Flask, render_template, request, redirect, url_for, flash 4from flask_sqlalchemy import SQLAlchemy 5from datetime import datetime 6from pytz import timezone 7import os 8 9app = Flask(__name__) 10key = os.urandom(21) 11app.secret_key = key 12 13app.config['SECRET_KEY'] = 'mysecretkey' 14URI = 'sqlite:///note.db' 15app.config['SQLALCHEMY_DATABASE_URI'] = URI 16app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 17db = SQLAlchemy(app) 18 19 20from sqlalchemy.engine import Engine 21from sqlalchemy import event 22 23@event.listens_for(Engine, "connect") 24def set_sqlite_pragma(dbapi_connection, connection_record): 25 cursor = dbapi_connection.cursor() 26 cursor.execute("PRAGMA foreign_keys=ON") 27 cursor.close() 28 29 30class Note(db.Model): 31 __tablename__='notes' 32 id = db.Column(db.Integer, primary_key=True) 33 title = db.Column(db.String(140)) 34 body = db.Column(db.String(300)) 35 date = db.Column(db.DateTime, default=datetime.now(timezone('Asia/Tokyo'))) 36 37 38@app.cli.command('initialize_DB') 39def initialize_DB(): 40 db.create_all() 41 42@app.route('/') 43def index(): 44 title = '一覧画面' 45 all_data = Note.query.all() 46 return render_template('index.html', title=title, all_data=all_data) 47 48@app.route('/create') 49def create(): 50 title = '新規作成' 51 return render_template('create.html', title=title) 52 53@app.route('/register', methods=['POST']) 54def register(): 55 title = request.form['title'] 56 if title: 57 body = request.form['body'] 58 # インスタンス化 59 register_data = Note(title=title, body=body) 60 db.session.add(register_data) 61 db.session.commit() 62 flash('登録完了') 63 return redirect(url_for('index')) 64 else: 65 flash('登録出来ませんでした') 66 return redirect(url_for('index')) 67 68@app.route('/detail') 69def detail(): 70 title = '詳細画面' 71 id = request.args.get('id') 72 print(id) 73 data = Note.query.get(id) 74 return render_template('index.html', title=title, data=data) 75 76 77if __name__ == '__main__': 78 app.run(debug=True) 79

html

1<!-- index.html --> 2 3<!DOCTYPE html> 4<html lang="ja"> 5<head> 6 <meta charset="UTF-8"> 7 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 8 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 9 <title>TOP</title> 10</head> 11<body> 12 {% with messages = get_flashed_messages() %} 13 {% if messages %} 14 {% for message in message %} 15 <b>{{ message }}</b> 16 {% endfor %} 17 {% endif %} 18 {% endwith %} 19 20 <h1> Flask Study Notes - {{ title }}</h1> 21 22 <table> 23 <tr> 24 <th>ID</th> 25 <th>タイトル</th> 26 <th>作成日</th> 27 </tr> 28 {% for i in all_data %} 29 <tr> 30 <td>{{ i.id }}</td> 31 <td><a href="/detail?={{ i.id }}">{{ i.title }}</a></td> 32 <td>{{ i.date.date() }}</td> 33 </tr> 34 {% endfor %} 35 <p><a href="/create">新規作成</a></p> 36 37 </table> 38 39 <footer> 40 <p>〇〇〇</p> 41 </footer> 42</body> 43</html> 44

html

1<!-- detail.html --> 2 3<!DOCTYPE html> 4<html lang="ja"> 5<head> 6 <meta charset="UTF-8"> 7 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 8 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 9 <title>詳細画面</title> 10</head> 11<body> 12 <h1> Flask Study Notes - {{ title }}</h1> 13 14 <p>タイトル: <b>{{ data.title }}</b></p> 15 <p></p> 16 <p>本文:</p> 17 <p><b>{{ data.body }}</b></p> 18 <footer> 19 <p>〇〇〇</p> 20 </footer> 21</body> 22</html> 23

イメージ説明

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

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

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

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

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

meg_

2023/01/14 11:57

> どうも、IDが取得できておらず、 その「ID」はDBに存在しているのでしょうか?
退会済みユーザー

退会済みユーザー

2023/01/14 12:00

はい。存在しております。 本文にDBのキャプチャーを掲載しますのでご確認ください。
meg_

2023/01/14 12:21

型も合っているのですよね?
退会済みユーザー

退会済みユーザー

2023/01/14 12:25

id = request.args.get('id')をid = request.args.get('id', type=int)としても結果は変わりません。
退会済みユーザー

退会済みユーザー

2023/01/14 12:37

モデルでも、 id = db.Column(db.Integer, primary_key=True)とint型を指定してます。
meg_

2023/01/14 12:43

> しかし、app.py内でPrint(id)は、Noneと表示されてしまっています。 上記は72行目の「print(id)」のことですか?そうなるとGETパラメーターに "id"というパラメーターがないのでは?
退会済みユーザー

退会済みユーザー

2023/01/14 22:42

>GETパラメーターに "id"というパラメーターがないのでは?とのことですが、どの様にすればよいでしょうか?色々しらべていますが、まだ、解決策が分からない状況です。
meg_

2023/01/15 02:41

detailとして渡しているならdetailで取り出すか、detailで渡すのをやめてidで渡せば良いのではないでしょうか?
guest

回答1

0

id = request.args.get('id')で取得したい場合、localhost:5000/detail?=4ではなく、http://localhost:5000/detail?id=4ですね。

また、FlaskにはURL処理機能があります。
URL処理機能の利用(Using URL Processors)

以下の様に書いた方が便利かもしれません。

python

1@app.route('/detail/<params>') 2def detail(params): 3 title = '詳細画面' 4 id = params 5 print(id) 6 return render_template('index.html', title=title)

上記へのアクセスは、http://localhost:5000/detail/4のようにします。

投稿2023/01/16 01:03

FiroProchainezo

総合スコア2401

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問