Section 9 database models

データを取得して、表示させる方法

テーブルを作るためにカタログパッケージの中にmodels.pyを設定する。 appフォルダーのdbをインポートする。 f:id:yukking3:20210502141723p:plain

dev, test, prodのどのアプリのどのデータベースを使うかを決めなければならないのでwith文を使って明確にしておく。 f:id:yukking3:20180624171552p:plain dev.pyには接続先等のconfigが書かれている f:id:yukking3:20210502120803p:plain


これ出すには7ファイル

run.py
/config/dev.py
/app/__init__.py
/app/catalog/__init__.py
/app/catalog/models.py
/app/catalog/routes.py
/app/catalog/templates/hopme.html


run.py →サーバー起動
f:id:yukking3:20180624181010p:plain dev.py →データベース接続
f:id:yukking3:20180624181049p:plain /app/init.py →catalog.mainのapp起動
f:id:yukking3:20180624181350p:plain /app/catalog/models.py →データベースのテーブルからデータ取得
f:id:yukking3:20180624181138p:plain /app/catalog/routes.py →modelsからテーブル取得して、@main.route('/')で設定して、render_template('home.html', books=books)でデータ飛ばす
f:id:yukking3:20180624181200p:plain /app/catalog/templates/hopme.html →で表示する
f:id:yukking3:20210502141427p:plain
ターミナル実行すると以下のようにデータベースから情報を取得して表示させることができる。 f:id:yukking3:20180624175218p:plain



データベースの画像を表示させる方法

以下のように画像データを配置する。 f:id:yukking3:20180624185119p:plain home.htmlは以下のように追記する。 f:id:yukking3:20180624185107p:plain



出版社ごとで絞って表示させる方法

home.htmlに以下を追記する。

<p><a href="">Publisher id:{{book.pub_id}}</a></p>

f:id:yukking3:20180624185855p:plain すると、hrefなのでurlが表示がされる。 f:id:yukking3:20180624185919p:plain

次にフィルターの設定をする。
<>で値を渡すことができる。 f:id:yukking3:20180624192204p:plain

pubulisher.htmlの設定をする。 f:id:yukking3:20180624192321p:plain

<!DOCTYPE html>
<html lang="en">
   
<head>
    <title> books inc </title>
    <meta charset="UTF-8">
</head>

<body>
    <h4>Books by {{ publisher.name }}</h4>
    <ol>
       {% for book in publisher_books %}
        <li type="1">
            {{ book.title }} by {{ book.author }}
        </li>
            {% endfor %}
    </ol>
</body>
</html>


home.htmlも追記する。href設定で2つのパラメーターを飛ばす。 f:id:yukking3:20180624194013p:plain

href="{{url_for('main.display_publisher', publisher_id=book.pub_id)}}"

飛ばされるのは、この部分である。
①routeの名前
②次に引数を f:id:yukking3:20180624194239p:plain



まとめ

run.py→init.py→route.py→publisher.htmlの順で動く。
①route.pyで@main.route('/')を通常表示する。
②ここでpublisherをクリックすると、route.pyに絞り込みスクリプトが実行される
③home.htmlに<p><a href=でURLを貼り付けてあるので次のページに飛ぶ
④publisher.htmlで②の絞込み処理をしたデータを表示する

*(route.pyではフィルター処理を行うコードとtemaplateに飛ばすコード)


@main.route('/display/publisher/<publisher_id>')
def display_publisher(publisher_id):
    publisher = Publication.query.filter_by(id=publisher_id).first()
    publisher_books = Book.query.filter_by(pub_id=publisher.id).all()
    return render_template('publisher.html',
                           publisher=publisher,
                           publisher_books=publisher_books)


<p><a href="{{url_for('main.display_publisher', publisher_id=book.pub_id)}}">Publisher id:{{book.pub_id}}</a></p>


URLを押すと次のページに飛ばすように設定する。 f:id:yukking3:20180506113029p:plain
次にIDをURLに表示させるようにする。 f:id:yukking3:20180506113437p:plain
その下でも同じIDを渡す。

@main.route('/display/publisher/<publisher_id>')
loacalhost.5000/display/publisher/5
ここを5にしたら<publisher_id>も5になるので
順にfilter処理が始まる。
def display_publisher(publisher_id): publisher = Publication.query.filter_by(id=publisher_id).first(

f:id:yukking3:20180506113520p:plain
渡されたらIDで絞り込み処理を行う。 f:id:yukking3:20180506113602p:plain
そしてブラウザに表示させる方法 f:id:yukking3:20180506113624p:plain



ちなみに、publisher_booksを消すと本が取得できなくなる。 f:id:yukking3:20180624195026p:plain f:id:yukking3:20180624195041p:plain publisherで作者名を絞って、publisher_booksで本を全て表示している。