Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
596 views
in Technique[技术] by (71.8m points)

python - Creating link to an url of Flask app in jinja2 template

In my Flask app, I have a view which displays a post

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

To display the last 10 entries, I have following view:

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

Now when I display the last 10 posts, I want to convert the title of a post into a hyperlink. Currently I have to do the following in my jinja template to achieve this:

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

Is there any way to avoid hard coding the url?

Like url_for function which is used to create Flask urls like this:

url_for('view_name',**arguments)

I have tried searching for one but I,m not able to find it.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I feel like you're asking two questions here but I'll take a shot...

For the posting url you'd do this:

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

To handle static files I'd highly suggest using an asset manager like Flask-Assets, but to do it with vanilla flask you do:

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

If you'd like more information I highly suggest you read. http://flask.pocoo.org/docs/quickstart/#static-files and http://flask.pocoo.org/docs/quickstart/#url-building

Edit for using kwargs:

Just thought I'd be more thorough...

If you'd like to use url_for like this:

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

You have to change your view to something like this:

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

Then your template code can look like this:

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

At this point I would actually create a method on the model so you don't have to turn it into a dict, but going that far is up to you :-).


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

56.9k users

...