2013-04-04 23 views
8

Tôi có một ứng dụng Flask nhỏ mà làm cho bài đăng trên blog:Flask mongoengine pagination

views.py:

class ListView(MethodView): 

    def get(self, page=1): 
     posts = Post.objects.all() 
     return render_template('posts/list.html', posts=posts) 

này là tất cả tốt, nhưng tôi muốn thêm pagination đến đối tượng posts . Nhìn vào project docs, tôi thấy có một lớp phân trang.

Vì vậy, tôi cố gắng này:

class ListView(MethodView): 

    def get(self, page=1): 
     posts = Post.objects.paginate(page=page, per_page=10) 
     return render_template('posts/list.html', posts=posts) 

Nhưng bây giờ tôi nhận được một lỗi:

TypeError: 'Pagination' object is not iterable 

Vậy làm thế nào để tôi lặp qua tôi posts trong mẫu?

Bất kỳ trợ giúp nào được đánh giá cao.

+1

Nhiệt độ của bạn là bao nhiêu mã trễ? Bạn có thể chia sẻ? – codegeek

Trả lời

8

Đối tượng Paginationitems list sẽ chứa các đối tượng tài liệu mongoengine (trong trường hợp của bạn là đối tượng Post). Danh sách này có thể được lặp qua để hiển thị các tài liệu.

Ví dụ, trong mẫu của bạn:

{% for post in posts.items %} 
    {{ post.title }} 
    {{ post.content }} 
{% endfor %} 

Để có được những con số trang thực tế cho các liên kết pagination, sử dụng iter_pages():

<div id="pagination-links"> 
    {% for page in posts.iter_pages() %} 
     {{ page }} 
    {% endfor %} 
</div> 

Cả documentationgithub link above, có một ví dụ tốt hơn cho liên kết pagination:

{% macro render_pagination(pagination, endpoint) %} 
    <div class=pagination> 
     {%- for page in pagination.iter_pages() %} 
      {% if page %} 
       {% if page != pagination.page %} 
        <a href="{{ url_for(endpoint, page=page) }}">{{ page }}</a> 
       {% else %} 
        <strong>{{ page }}</strong> 
       {% endif %} 
      {% else %} 
       <span class=ellipsis>…</span> 
      {% endif %} 
     {%- endfor %} 
    </div> 
{% endmacro %} 
+0

liên kết github cập nhật để phản ánh bản phát hành bình-mongoengine mới nhất –