43

私の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次のようなFlaskURLを作成するために使用されるLike関数:

url_for('view_name',**arguments)

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

4

1 に答える 1

83

ここで2つの質問をしているような気がしますが、ショットを撮ります...

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

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

静的ファイルを処理するには、Flask-Assetsなどのアセットマネージャーを使用することを強くお勧めしますが、バニラフラスコを使用して処理するには、次のようにします。

{{ 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_of_some_kind # This is assuming you use some kind of 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)

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

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

この時点で、私は実際にモデルにメソッドを作成するので、それをdictに変換する必要はありませんが、それまでの道のりはあなた次第です:-)。

于 2012-06-20T17:41:25.380 に答える