web-dev-qa-db-fra.com

Création d'un lien vers une URL de Flask dans le modèle jinja2

Dans mon Flask, j'ai une vue qui affiche un message

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

Pour afficher les 10 dernières entrées, j'ai la vue suivante:

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

Maintenant, lorsque j'affiche les 10 derniers articles, je veux convertir le titre d'un article en hyperlien. Actuellement, je dois faire ce qui suit dans mon modèle jinja pour y parvenir:

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

Existe-t-il un moyen d'éviter de coder en dur l'URL?

Comme url_for fonction utilisée pour créer Flask urls comme ceci:

url_for('view_name',**arguments)

J'ai essayé d'en chercher un, mais je ne le trouve pas.

34
codecool

J'ai l'impression que vous posez deux questions ici, mais je vais essayer ...

Pour l'URL de publication, vous feriez ceci:

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

Pour gérer des fichiers statiques, je suggère fortement d'utiliser un gestionnaire d'actifs comme Flask-Assets , mais pour le faire avec Vanilla flask vous faites:

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

Si vous souhaitez plus d'informations, je vous suggère fortement de lire. http://flask.pocoo.org/docs/quickstart/#static-files et http://flask.pocoo.org/docs/quickstart/#url-building =

Modifier pour utiliser les kwargs:

Je pensais juste que je serais plus approfondie ...

Si vous souhaitez utiliser url_for comme ça:

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

Vous devez changer votre vue en quelque chose comme ceci:

@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)

Le code de votre modèle peut alors ressembler à ceci:

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

À ce stade, je créerais en fait une méthode sur le modèle afin que vous n'ayez pas à le transformer en dict, mais aller aussi loin dépend de vous :-).

70
ravenac95