jinja2テンプレートでFlaskアプリのURLへのリンクを作成する質問する

jinja2テンプレートでFlaskアプリのURLへのリンクを作成する質問する

Flaskアプリには投稿を表示するビューがあります

@post_blueprint.route('/post/<int:year>/<int:month>/<title>')
def get_post(year,month,title):
    # My code

最後の 10 件のエントリを表示するには、次のビューを使用します。

@post_blueprint.route('/posts/')
def get_all_posts():
    # My code
    return render_template('p.html',posts=posts)

最後の 10 件の投稿を表示するときに、投稿のタイトルをハイパーリンクに変換したいと思います。現在、これを実現するには、jinja テンプレートで次の操作を行う必要があります。

<a href="/post/{{year}}/{{month}}/{{title}}">{{title}}</a>

URL のハードコーディングを回避する方法はありますか?

url_for次のような Flask URL を作成するために使用される関数と同様です。

url_for('view_name',**arguments)

探してみましたが、見つかりません。

ベストアンサー1

ここでは 2 つの質問をしているように感じますが、試してみます...

投稿 URL の場合は次のようにします。

<a href="{{ url_for('post_blueprint.get_post', year=year, month=month, title=title)}}">
    {{ title }}
</a>

静的ファイルを扱うには、次のようなアセットマネージャを使用することを強くお勧めします。フラスコアセットただし、バニラフラスコでこれを行うには、次のようにします。

{{ url_for('static', filename='[filenameofstaticfile]') }}

さらに詳しい情報をお知りになりたい場合は、ぜひお読みになることをお勧めします。http://flask.pocoo.org/docs/quickstart/#static-filesそしてhttp://flask.pocoo.org/docs/quickstart/#url-building

kwargs を使用するための編集:

もっと徹底しようと思ったのですが...

次のように使用したい場合url_for:

{{ url_for('post_blueprint.get_post', **post) }}

ビューを次のように変更する必要があります。

@post_blueprint.route('/posts/')
def get_all_posts():
    models = database_call_to_fetch_posts() # This is assuming you use some kind of data-model
    posts = []
    for model in models:
        posts.append(dict(year=model.year, month=model.month, title=model.title))
    return render_template('p.html', posts=posts)

def database_call_to_fetch_posts():
    posts = [] 
    # fetch posts here as a list of objects
    ... 
    return posts

テンプレート コードは次のようになります。

{% for post in posts %}
    <a href="{{ url_for('post_blueprint.get_post', **post) }}">
        {{ post['title'] }}
    </a>
{% endfor %}

この時点で、モデルにメソッドを作成して辞書に変換する必要がないようにしますが、そこまではあなた次第です :-)。

おすすめ記事