2012-06-20 24 views
24

Trong ứng dụng Flask của tôi, tôi có một cái nhìn mà hiển thị một bàiTạo liên kết đến một url của ứng dụng Flask trong mẫu jinja2

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

Để hiển thị 10 mục cuối cùng, tôi đã sau xem:

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

Bây giờ khi tôi hiển thị 10 bài đăng cuối cùng, tôi muốn chuyển đổi tiêu đề của bài đăng thành một siêu liên kết. Hiện nay tôi phải làm như sau trong mẫu jinja của tôi để đạt được điều này:

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

Có cách nào để tránh cứng mã hóa url?

Giống như url_for chức năng được sử dụng để tạo ra các url Flask như thế này:

url_for('view_name',**arguments) 

Tôi đã cố gắng tìm kiếm một nhưng tôi, m không thể tìm thấy nó.

+0

Vì vậy, bạn muốn có url_for sử dụng kwargs? Cách duy nhất để làm điều đó sẽ là có các bài viết như một danh sách các dicts. Tôi không tin rằng có một cách để điều đó được thực hiện mà không thay đổi logic của bạn trong khung nhìn đầu tiên. – ravenac95

+0

Không, tôi không muốn điều đó – codecool

Trả lời

57

tôi cảm thấy như bạn đang yêu cầu hai câu hỏi ở đây nhưng tôi sẽ chụp ...

Đối url gửi bài bạn muốn làm điều này:

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

Để xử lý các tập tin tĩnh tôi rất muốn đề nghị sử dụng một người quản lý tài sản như Flask-Assets, nhưng để làm điều đó với vani bình bạn làm:

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

Nếu bạn muốn biết thêm thông tin tôi đánh giá cao đề nghị bạn đọc. http://flask.pocoo.org/docs/quickstart/#static-fileshttp://flask.pocoo.org/docs/quickstart/#url-building

Sửa sử dụng kwargs:

Chỉ cần nghĩ rằng tôi muốn được triệt để hơn ...

Nếu bạn muốn sử dụng url_for như thế này:

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

Bạn phải thay đổi chế độ xem của bạn thành một cái gì đó như thế này:

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

Sau đó, mẫu mã của bạn có thể trông như thế này:

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

Tại thời điểm này, tôi thực sự sẽ tạo ra một phương pháp trên mô hình, do đó bạn không cần phải biến nó thành một dict, nhưng đi xa là tùy thuộc vào bạn :-).

+3

Loại 'mô hình' là gì và tại sao chúng ta cần biến nó thành một dict? Chúng ta không thể vượt qua nó để xem và chỉ cần lặp lại ở đó? – Ansd

Các vấn đề liên quan