コンテンツにスキップ

第4章 投稿一覧

1 app.py

次に index.html で投稿の一覧が出るようにします。まず、index関数で toukouテーブルを全検索し、rowsに格納します。それをindex.htmlに渡します。 全検索時にhiの降順で整列します。

@app.get('/')
def index():
    rows = Toukou.query.order_by(db.desc('hi')).all()
    return render_template("index.html", rows=rows)

2 index.html

index.htmlではfor文で投稿全てを表示します。これはindex.htmlの{% block main %}~{% endblock %}までの間に書いていきます。

投稿一件をdivタグで囲んで、ユーザ名、投稿日時、画像をそれぞれdivタグで囲んで表示してみましょう。このとき、ユーザ名は r.user.unameのようになります。画像は全てstaticフォルダにありますのでこれを表示します。

<div id="photos">
    {% for r in rows %}
    <div class="toukou">
        <div class="uname">{{r.user.uname}}</div>
        <div class="hi">{{r.hi}}</div>
        <div class="image">
            <a href="/toukou/{{r.tid}}">
                <img src="/static/{{r.image}}">
            </a>
        </div>
    </div>
    {% endfor %}
</div>

実行し確認します。

このままでは投稿日時がマイクロ秒単位まで表示されます。そこで、strfrime関数で書式を指定しておきます。

<div class="hi">{{r.hi.strftime('%Y/%m/%d %H:%M:%S')}}</div>

3 style.css

staticフォルダにあるstyle.cssにスタイルを設定します。まず、投稿一覧全体を囲む id="photos" のところにグリッド(表形式)で表示するよう指定を行います。各列を33%ずつに区切ります。

#photos {
    display: grid;
    grid-template-columns: 33% 33% 33%;
}

次に投稿一件にスタイルを付けます。背景色は白にし、ライトグレイの枠線を付けます。角を丸くし、内側の余白を1文字分、外側の余白に上下0.3文字分、左右1文字分を付けます。

.toukou {
    background-color: white;
    border: 1px solid lightgray;
    border-radius: 8px;
    padding: 1em;
    margin:0.3em 1em;
}

ユーザ名は太字に、投稿日時は少しも字を小さくし、グレイで表示します。

.uname {
    font-weight: bold;
}

.hi {
    color: gray;
    font-size: 0.8em;
}

画像は中央寄せにします。imgタグは最大幅100%を指定し枠を越えないようにします。画像の角は丸くします。

.image {
    text-align: center;
    margin-top: 0.5em;
}

.image img {
    max-width: 100%;
    border-radius: 4px;
}