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
> どうも、IDが取得できておらず、
その「ID」はDBに存在しているのでしょうか?

はい。存在しております。
本文にDBのキャプチャーを掲載しますのでご確認ください。
型も合っているのですよね?

id = request.args.get('id')をid = request.args.get('id', type=int)としても結果は変わりません。

モデルでも、 id = db.Column(db.Integer, primary_key=True)とint型を指定してます。
> しかし、app.py内でPrint(id)は、Noneと表示されてしまっています。
上記は72行目の「print(id)」のことですか?そうなるとGETパラメーターに "id"というパラメーターがないのでは?

>GETパラメーターに "id"というパラメーターがないのでは?とのことですが、どの様にすればよいでしょうか?色々しらべていますが、まだ、解決策が分からない状況です。
detailとして渡しているならdetailで取り出すか、detailで渡すのをやめてidで渡せば良いのではないでしょうか?
