【问题标题】:How to display a list across multiple pages in Flask?如何在 Flask 中跨多个页面显示列表?
【发布时间】:2020-09-30 10:38:34
【问题描述】:

在 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 个项目,以此类推列表中的所有项目.有谁知道这样做的最佳方法?

【问题讨论】:

    标签: python html flask jinja2


    【解决方案1】:

    首先,您需要创建一个分页对象以传递给包装的路由方法的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>
    
     
    

    【讨论】:

    • 正是我想要的。谢谢!
    • @LuckyB 很高兴为您提供帮助!
    【解决方案2】:

    您正在寻找不直接包含在 Flask 框架中的分页功能。你应该考虑使用类似Flask-paginate

    【讨论】:

      【解决方案3】:

      你可以这样做:

      @app.route('/displayitems/<page>/')
      def displayitems(page=1):
         items_per_page = 20
         item_list = ['item1', 'item2', 'item3', etc..]
         start_pos = 0 if page == 1 else items_per_page * (page - 1)       
         return render_template('displayitems.html', item_list=item_list[start_pos: start_pos + items_per_page])
      

      在页面加载时调用http://your_domain/displayitems/1/,然后在每次单击“下一步”按钮时增加页码。

      注意: 确保 start_posstart_pos + items_per_page len(item_list) 否则会出现异常。

      【讨论】:

        【解决方案4】:

        我需要做类似的事情。在观看 Corey Schafer 关于分页的 Flask 教程后,我找到了一个简单的方法。我需要对其进行一些更改,因为我不使用数据库(具有用于分页的内置功能)。我的编码方式如下:

        @app.route('/home')
        def home(): #this doesn't make a request
            #pagination
            current_page = request.args.get('page', 1, type=int)
                    #the variable page will store the (integer) part after '?page=' from the url
                    #http://localhost:5000/?page=1
                    #http://localhost:5000/?page=2
            #pages, per page
            items_per_page= 20
            pages = round(len(item_list)/items_per_page+ .499) #the .499 is for rounding to the upside
            from_page = int(page) * items_per_page - items_per_page #36 per page
            upto_page = int(page) * items_per_page
        
            list_part = item_list[from_page:upto_page]
        
        
        return render_template('displayitems.html', list_part=list_part, pages=pages, current_page=current_page)
        

        因此,您无需提供完整列表item_list=item_list,而是提供该列表的一部分list_part=list_part。在模板中渲染分页:

        {% for page_num in range(1, pages) %}
          {% if page_num in [1, 2, 3, current_page, current_page-1, current_page+1, pages-3, pages-2, pages-1] %}
            {% if current_page == page_num %}
              <a class="btn btn-info mb-4" href="{{ url_for('home', page=page_num) }}">{{ page_num }}</a>
            {% else %}
              <a class="btn btn-outline-info mb-4" href="{{ url_for('home', page=page_num) }}">{{ page_num }}</a>
            {% endif %}
          {% elif current_page > 4 and page_num == 4 %}
              ....
          {% elif current_page < pages-4 and page_num == pages-4 %}
              ....
          {% endif %}
        {% endfor %}
        

        我没有使用下一个/上一个按钮(当我有解决方案和时间时,我会添加这个)。但即使是长列表也有很好的样式,用省略号表示有更多页面但不显示所有页面。活动页面的按钮有一个不同的类,用于显示您在哪个页面上。

        您可以通过更改 url 中 ?page= 之后的整数来快速转到页面:http://localhost:5000/?page=1

        编辑: 要添加下一个/上一个按钮,请将以下 Flask if 块放在 for 循环之外。

        {% if current_page != 1 %}
            <a class="btn btn-outline-info mb-4" href="{{ url_for('home', page=current_page-1) }}"><<</a>
        {% endif %}
        
        {% for page_num in range(1, pages) %}
         ...........[SAME PART AS ABOVE]..........
        {% endfor %}
        
        {% if current_page != pages %}
            <a class="btn btn-outline-info mb-4" href="{{ url_for('home', page=current_page+1) }}">>></a>
        {% endif %}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-11-18
          • 1970-01-01
          • 1970-01-01
          • 2018-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多