Создание ссылки на url-адрес приложения Flask в шаблоне jinja2

в моем приложении 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 функция которая использована для создания urls склянки как это:

url_for('view_name',**arguments)

Я пробовал искать один, но я не могу его найти.

1 ответов


Я чувствую, что вы задаете два вопроса здесь, но я сделаю выстрел...

для размещения 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_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 %}

на данный момент я бы фактически создал метод на модели таким образом, вам не нужно превращать его в дикт, но идти так далеко зависит от вас :-).