在Flask中,我试图在多个页面上显示一个动态的项目列表。 列表的大小可能会超过1000。
在app.py我有一个路线,如:
@app.route('/displayitems') def displayitems(): item_list = ['item1', 'item2', 'item3'] # Up to 1000 items return render_template('displayitems.html', item_list=item_list)然后在displayitems.html我有:
{% for item in itemList%} <li class="list-group-item"> <div class="item_number">{{ loop.index }}</div> <div class="item_name">{{ item }}</div> </li> {% endfor %}其中列出了同一页面上的所有项目。 但是,我想以某种方式拥有一页上的前20项,然后可以单击“下一步”按钮来查看另一页上的下20项,以此类推对于列表中的所有项目。 有没有人知道这样做的最好方法?
In Flask, I am trying to display a dynamic list of items across multiple pages. The size of the list can possibly reach over 1000.
In app.py I have a route such as:
@app.route('/displayitems') def displayitems(): item_list = ['item1', 'item2', 'item3'] # Up to 1000 items return render_template('displayitems.html', item_list=item_list)Then in displayitems.html i have:
{% for item in itemList%} <li class="list-group-item"> <div class="item_number">{{ loop.index }}</div> <div class="item_name">{{ item }}</div> </li> {% endfor %}Which lists all items on the same page. However, I would like to somehow have, say, the first 20 items on one page, then be able to click a "next" button to view the next 20 items on another page, and so on for all of the items in the list. Does anyone know the best way to go about doing this?
最满意答案
首先,你需要创建一个pagenation对象传递给包装的路由方法的render_template :
class PageResult: def __init__(self, data, page = 1, number = 20): self.__dict__ = dict(zip(['data', 'page', 'number'], [data, page, number])) self.full_listing = [self.data[i:i+number] for i in range(0, len(self.data), number)] def __iter__(self): for i in self.full_listing[self.page-1]: yield i def __repr__(self): #used for page linking return "/displayitems/{}".format(self.page+1) #view the next page @app.route('/displayitems/<pagenum>') def displayitems(pagenum): item_list = ['item1', 'item2', 'item3'] return render_template('displayitems.html', listing = PageResult(item_list, pagenum))然后,在您的模板中,使用引导程序和当前列表创建分页:
<ul> {%for item in listing%} <li>{{item}}</li> {%endfor%} </ul> <ul class="pagination"> {%if listing.page == 1%} <li class="page-item disabled"><a class="page-link" href="#">Previous</a></li> {%else%} <li class="page-item"><a class="page-link" href="/displayitems/{{listing.page-1}}">Previous</a></li> {%endif%} <li class="page-item"><a class="page-link" href="{{listing}}">Next</a></li> </ul>First, you will want to create a pagenation object to pass to the wrapped route method's render_template:
class PageResult: def __init__(self, data, page = 1, number = 20): self.__dict__ = dict(zip(['data', 'page', 'number'], [data, page, number])) self.full_listing = [self.data[i:i+number] for i in range(0, len(self.data), number)] def __iter__(self): for i in self.full_listing[self.page-1]: yield i def __repr__(self): #used for page linking return "/displayitems/{}".format(self.page+1) #view the next page @app.route('/displayitems/<pagenum>') def displayitems(pagenum): item_list = ['item1', 'item2', 'item3'] return render_template('displayitems.html', listing = PageResult(item_list, pagenum))Then, in your template, create the pagination with bootstrap and current listing:
<ul> {%for item in listing%} <li>{{item}}</li> {%endfor%} </ul> <ul class="pagination"> {%if listing.page == 1%} <li class="page-item disabled"><a class="page-link" href="#">Previous</a></li> {%else%} <li class="page-item"><a class="page-link" href="/displayitems/{{listing.page-1}}">Previous</a></li> {%endif%} <li class="page-item"><a class="page-link" href="{{listing}}">Next</a></li> </ul>更多推荐
发布评论