flask分页宏增加更多参数

背景:我正在开发一个博客,核心的两个model是文章和文章类别。

现在想要实现的功能是:点击一个文章类别,以分页的形式显示这个文章类别下的所有文章,类似这种效果。

参考的书中分页宏只接受页数这一个参数,经过尝试,成功给分页宏添加了文章类别参数,实现了上述功能。

posts.html

{% extends "public/base.html" %}
{% import "public/macros.html" as macros %}

{% block content %}
    <div class="row" style="margin-top: 20px;">
        <div class="col-sm-4">
            {% include "public/categories.html" %}
        </div>
        {% if posts %}
            <div class="col-sm-8">
                {% include "public/_posts.html" %}
            <div style="text-align: center; margin-top: 20px;">
                {% if category %}
                    {{  macros.pagination_widget(pagination, '.posts', category.id) }}
                {% else %}
                    {{  macros.pagination_widget(pagination, '.posts', 0) }}
                {% endif %}
            </div>
        </div>
        {% endif %}
    </div>
{% endblock %}

关键代码

macros.html

{% macro pagination_widget(pagination, endpoint, category_id) %}
        <ul class="pagination justify-content-center">
            <li {% if not pagination.has_prev %} class="page-item disabled" {% else %} class="page-item" {% endif %}>
                <a class="page-link" href="{% if pagination.has_prev %}{{ url_for(endpoint,
                page = pagination.page - 1, category_id = category_id, **kwargs) }}{% else %}#{% endif %}">
                Previous
                </a>
            </li>
                    {% for p in pagination.iter_pages() %}
                        {% if p %}
                            {% if p == pagination.page %}
                            <li class="page-item active">
                            <a class="page-link" href="{{ url_for(endpoint, page = p, category_id = category_id, **kwargs) }}">{{ p }}</a>
                            </li>
                            {% else %}
                            <li class="page-item">
                            <a class="page-link" href="{{ url_for(endpoint, page = p, category_id = category_id, **kwargs) }}">{{ p }}</a>
                            </li>
                            {% endif %}
                        {% else %}
                        <li class="page-item disabled"><a class="page-link" href="#">&hellip;</a></li>
                        {% endif %}
                    {% endfor %}
            <li {% if not pagination.has_next %} class="disabled page-item" {% else %} class="page-item"{% endif %}>
                <a class="page-link" href="{% if pagination.has_next %}{{ url_for(endpoint,
                page = pagination.page + 1, category_id = category_id, **kwargs) }}{% else %}#{% endif %}">
                Next
                </a>
            </li>
        </ul>
{% endmacro %}

关键代码

routes.py

@app.route('/posts', methods=['GET', 'POST'])
@app.route('/posts/<int:category_id>', methods=['GET', 'POST'])
def posts(category_id=0):
    page = request.args.get('page', 1, type=int)
    if 0 != category_id:
        category = Category.query.get_or_404(category_id)
        pagination = Post.query.with_parent(category).order_by(Post.timestamp.desc()).paginate(page=page, per_page=10)
    else:
        category = None
        pagination = Post.query.order_by(Post.timestamp.desc()).paginate(page=page, per_page=10)
    posts = pagination.items
    categories = Category.query.all()
    return render_template('public/posts.html', posts=posts, pagination=pagination, categories=categories, category=category)

关键代码

 

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
EntityManager提供了多种分页查询的方式,其中一种常用的方式是使用TypedQuery和CriteriaBuilder结合使用。 假设我们有一个实体类User,其中有三个属性:id、username和age。现在我们需要根据username和age进行分页查询,查询结果按照id升序排列。 以下是示例代码: ```java public List<User> findUsersByPage(String username, int age, int pageNum, int pageSize) { EntityManager entityManager = ...; // 获取EntityManager实例 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class); Root<User> root = criteriaQuery.from(User.class); // 构建查询条件 List<Predicate> predicates = new ArrayList<>(); if (StringUtils.isNotBlank(username)) { predicates.add(criteriaBuilder.like(root.get("username"), "%" + username + "%")); } if (age > 0) { predicates.add(criteriaBuilder.equal(root.get("age"), age)); } criteriaQuery.where(predicates.toArray(new Predicate[0])); // 构建排序条件 criteriaQuery.orderBy(criteriaBuilder.asc(root.get("id"))); // 构建分页查询 TypedQuery<User> typedQuery = entityManager.createQuery(criteriaQuery); typedQuery.setFirstResult((pageNum - 1) * pageSize); typedQuery.setMaxResults(pageSize); // 执行查询并返回结果 return typedQuery.getResultList(); } ``` 在上述代码中,我们首先获取了EntityManager实例,并获取了CriteriaBuilder实例。然后,我们构建了一个CriteriaQuery<User>对象,并指定实体类为User。接着,通过调用criteriaQuery.from(User.class)方法获取了Root<User>对象,并开始构建查询条件和排序条件。 在构建查询条件时,我们先创建了一个Predicate列表,并根据传入的参数构建Predicate。如果username不为空,则添加一个模糊查询的Predicate;如果age大于0,则添加一个等于查询的Predicate。最后,将Predicate列表转换成数组,并设置为查询条件。 在构建排序条件时,我们调用了orderBy方法,并指定按照id升序排列。 最后,我们通过创建TypedQuery<User>对象,并设置分页参数,执行查询并返回结果。 需要注意的是,在调用getResultList方法之前,我们还可以调用其他方法设置查询缓存、锁定查询结果等。详细使用方法可以参考JPA的相关文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值