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.
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 :-).