Python Django项目下的分页和筛选查询

简介: 在Django中实现分页功能,视图函数通过`Paginator`处理数据,每页显示10条记录。URL配置支持带参数和不带参数的分页请求。前端模板使用for循环展示分页数据,包括商品信息和状态按钮,并利用分页组件导航。筛选查询视图根据GET请求的`state`参数过滤上架或下架产品,同样实现分页功能。前端添加状态选择下拉框,分页链接携带查询参数`state`确保筛选状态在翻页时保持。

分页

当我们的数据过多是,我们需要对数据进行分页,即每页显示多少行,有多少页,好在Django已经为我们准备好了,直接套用即可

视图函数

下方我是将三个数据表中的数据合在一起,准备渲染到界面,

注意:三个数据表中需要有一个可以分辨其实不同数据表的字段,方便我们在前端分别渲染

我们给一个page参数,默认是1

def allprodect(request,page = 1):
    # 获取cookie中的usid值,不存在则默认0
    usid = request.COOKIES.get('usid', 0)
    # 查询数据库中是否存在用户
    user = UserMondel.objects.filter(id=usid).first()
    # 如果usid等于0,则代表用户不存在,则需定位到登录页
    if usid == 0:
        return redirect(reverse('login'))
    per_page = 10
    injection = injection_machine.objects.filter().all()
    machining = machining_machine.objects.filter().all()
    robots = robot.objects.filter().all()
    allinfo  = list(injection) + list(machining) + list(robots)
    # 分页器
    paginator = Paginator(allinfo, per_page)
    # 获取第几页數據
    injection_page = paginator.page(page)
    # 页码范围,可以遍历
    pages = paginator.page_range
    return render(request, 'allprodect.html',
                  {
   'injection_page': injection_page, 'pages': pages, 'pageone': page, 'user': user})

URL

在URL当中设置带参请求和不带参两个请求

path('allprodect/<int:page>',allprodect,name='allprodect'),
path('allprodect/',allprodect,name='allprodect'),

前端

使用for循环对其进行渲染,我这边因为三个数据库中显示的字段都是一样的,所以可以放在一起,如果你的是不同的,则需要分别不同渲染

{% for inject in injection_page %}
        {% csrf_token %}
            <div class="row mb-3 custom-card col-md-8 custom-card-hover"> <!-- 添加 custom-card-hover 类 -->
                <a href="#" class="text-decoration-none col-md-10 d-flex">
                <!-- 图片区域在左边 -->
                <div class="col-md-4">
                    <img src="{
  { inject.photo.url }}" alt="图片" class="custom-img" style="height: 120px;width:auto;max-width: 100%;object-fit: contain">
                </div>
                <!-- 文字数据区域 -->
                <div class="col-md-8">
                    <!-- 左边参数 -->
                    <div class="row">
                        <div class="col-md-6">
                            <ul>
                                {% if inject.classify is null %}
                                    <li>類別:{
  { inject.classifys }}</li>
                                {% else %}
                                    <li>類別:{
  { inject.classify }}</li>
                                {% endif %}

                                <li>品牌:{
  { inject.brand }}</li>
                                <li>型号:{
  { inject.model }}</li>
                                <li>年份:{
  { inject.year }}</li>
                            </ul>
                        </div>
                        <!-- 右边参数 -->
                        <div class="col-md-6">

                            <ul>
                                {% if inject.is_Shelves == 1%}
                                    <li>状态:上架</li>
                                {% else %}
                                    <li>状态:下架</li>
                                {% endif %}
                            </ul>
                        </div>

                    </div>
                </div>
                </a>
            <!-- 按钮区域 -->
            <div class="col-md-2 d-flex align-items-center">
                {% if inject.classify is null %}
                    <button type="button" class="btn btn-success mx-1" onclick="prodectshelves('{
  { inject.id }}','{
  { inject.classifys }}','{
  { user.id }}')">上架</button>
{#                                    <li>類別:{
  { inject.classifys }}</li>#}
                                {% else %}
{#                                    <li>類別:{
  { inject.classify }}</li>#}
                    <button type="button" class="btn btn-success mx-1" onclick="prodectshelves('{
  { inject.id }}','{
  { inject.classify }}','{
  { user.id }}')">上架</button>
                                {% endif %}

                {% if inject.classify is null %}
                    <button type="button" class="btn btn-danger mx-1" onclick="prodectshelvesunder('{
  { inject.id }}','{
  { inject.classifys }}','{
  { inject.id }}')">下架</button>
                                    {% else %}
    {#                                    <li>類別:{
  { inject.classify }}</li>#}
                    <button type="button" class="btn btn-danger mx-1" onclick="prodectshelvesunder('{
  { inject.id }}','{
  { inject.classify }}','{
  { inject.id }}')">下架</button>
                                    {% endif %}


            </div>
            </div>


        <hr>
    {% endfor %}

分页组件

injection_page.previous_page_number中的previous_page_number会获取当前页面的上一页

injection_page.next_page_number中的next_page_number会获取当前页面的下一页

pages是数据所有的页面,可以进行循环并显示

<!-- 分页组件 -->
<nav aria-label="Page navigation example">
    <ul class="pagination">
    {% if injection_page.has_previous %}
        <li class="page-item"><a class="page-link" href="{% url 'allprodect' injection_page.previous_page_number %}">上一页</a></li>
    {% endif %}
    {% for page in pages %}
        <li class="page-item"><a class="page-link" href="{% url 'allprodect' page %}">{
  { page }}</a></li>
    {% endfor %}
    {% if injection_page.has_next %}
        <li class="page-item"><a class="page-link" href="{% url 'allprodect' injection_page.next_page_number%}">下一页</a></li>
    {% endif %
    </ul>
</nav>

筛选查询

目前有一个筛选查询的需求,可以查询已上架和下架的产品,并且如果数据过多,以分页的页面进行展示

视图函数

在这个视图函数中,我们首先判断其实GET请求,并在GET请求中获取来自前端页面的state参数值,以此来查询上架和未上架的产品,数据库字段使用的是布尔值,也就是1和0,故咋前端页面传值是只需要传1或者0 即可查询不同的值数据,

因为筛选的是三个数据表中的数据,故需要对其进行数据合并,然后传送至前端进行渲染显示

def Searchstate(request,page = 1):
    # 获取cookie中的usid值,不存在则默认0
    usid = request.COOKIES.get('usid', 0)
    # 查询数据库中是否存在用户
    user = UserMondel.objects.filter(id=usid).first()
    # 如果usid等于0,则代表用户不存在,则需定位到登录页
    if usid == 0:
        return redirect(reverse('login'))
    if request.method == 'GET':
        state = request.GET.get("state")
        per_page = 5
        injection = injection_machine.objects.filter(is_Shelves=state).all()
        machining = machining_machine.objects.filter(is_Shelves=state).all()
        robots = robot.objects.filter(is_Shelves=state).all()
        allinfo = list(injection) + list(machining) + list(robots)
        # 分页器
        paginator = Paginator(allinfo, per_page)
        # 获取第几页數據
        injection_page = paginator.page(page)
        # 页码范围,可以遍历
        pages = paginator.page_range
        return render(request, 'Searchstate.html',
                      {
   'injection_page': injection_page, 'pages': pages, 'pageone': page, 'user': user})

URL

带参进行分页时使用,不带参正常请求

path('Searchstate/<int:page>',Searchstate,name='Searchstate'),
path('Searchstate/',Searchstate,name='Searchstate'),

前端

注意:在下面代码中,form表单中,提交的地址是:{% url 'Searchstate' 1%}给路径一个默认值是1,方式是GET,提交ID是state的值,

<div class="container mt-4"> <!-- 添加 mt-4 类来设置顶部间隙 -->
    <hr>
<form method="get" action="{% url 'Searchstate' 1%}" class="form-inline align-items-end"> <!-- 添加 align-items-end 类 -->
        <div class="form-group mb-2 mr-2">
            <label for="state">狀態:</label>
            <select id="state" name="state" class="form-control">
                <option value="1">上架</option>
                <option value="0">下架</option>
                <!-- 添加更多选项 -->
            </select>
        </div>
    <div class="form-group mb-2">
            <button type="submit" class="btn btn-primary">搜索</button>
        </div>
</form>
    {% for inject in injection_page %}
            <div class="row mb-3 custom-card col-md-8 custom-card-hover"> <!-- 添加 custom-card-hover 类 -->
                <a href="#" class="text-decoration-none col-md-10 d-flex">
                <!-- 图片区域在左边 -->
                <div class="col-md-4">
                    <img src="{
    { inject.photo.url }}" alt="图片" class="custom-img" style="height: 120px;width:auto;max-width: 100%;object-fit: contain">
                </div>
                <!-- 文字数据区域 -->
                <div class="col-md-8">
                    <!-- 左边参数 -->
                    <div class="row">
                        <div class="col-md-6">
                            <ul>
                                {% if inject.classify is null %}
                                    <li>類別:{
  { inject.classifys }}</li>
                                {% else %}
                                    <li>類別:{
  { inject.classify }}</li>
                                {% endif %} 

                                <li>品牌:{
  { inject.brand }}</li>
                                <li>型号:{
  { inject.model }}</li>
                                <li>年份:{
  { inject.year }}</li>
                            </ul>
                        </div>
                        <!-- 右边参数 -->
                        <div class="col-md-6">

                            <ul>
                                {% if inject.is_Shelves == 1%}
                                    <li>状态:上架</li>
                                {% else %}
                                    <li>状态:下架</li>
                                {% endif %}
                            </ul>
                        </div>

                    </div>
                </div>
                </a>
            <!-- 按钮区域 -->
            <div class="col-md-2 d-flex align-items-center">
                {% if inject.classify is null %}
                    <button type="button" class="btn btn-success mx-1" onclick="searchprodectshelves('{
    { inject.id }}','{
    { inject.classifys }}','{
    { user.id }}')">上架</button>
{#                                    <li>類別:{
  { inject.classifys }}</li>#}
                                {% else %}
{#                                    <li>類別:{
  { inject.classify }}</li>#}
                    <button type="button" class="btn btn-success mx-1" onclick="searchprodectshelves('{
    { inject.id }}','{
    { inject.classify }}','{
    { user.id }}')">上架</button>
                                {% endif %}

                {% if inject.classify is null %}
                    <button type="button" class="btn btn-danger mx-1" onclick="searchprodectshelvesunder('{
    { inject.id }}','{
    { inject.classifys }}','{
    { inject.id }}')">下架</button>
                                    {% else %}
    {#                                    <li>類別:{
  { inject.classify }}</li>#}
                    <button type="button" class="btn btn-danger mx-1" onclick="searchprodectshelvesunder('{
    { inject.id }}','{
    { inject.classify }}','{
    { inject.id }}')">下架</button>
                                    {% endif %}


            </div>
            </div>
        <hr>
    {% endfor %}
</div>

点击搜索后,地址是:http://127.0.0.1:8000/Searchstate/?state=1

因为我们的数据有多个,还需要进行分页,故在分页组件中要特别指定?state={ { request.GET.state }}会将GET请求的参数带上查询,

如第第二页就是:http://127.0.0.1:8000/Searchstate/2?state=1

<!-- 分页组件 -->
<nav aria-label="Page navigation example">
    <ul class="pagination">
    {% if injection_page.has_previous %}
        <li class="page-item"><a class="page-link" href="{% url 'Searchstate' injection_page.previous_page_number %}?state={
    { request.GET.state }}">上一页</a></li>
    {% endif %} 

    {% for page in pages %}
        <li class="page-item"><a class="page-link" href="{% url 'Searchstate' page %}?state={
    { request.GET.state }}">{
  { page }}</a></li>
    {% endfor %}

    {% if injection_page.has_next %}
        <li class="page-item"><a class="page-link" href="{% url 'Searchstate' injection_page.next_page_number%}?state={
    { request.GET.state }}">下一页</a></li>
    {% endif %} 

    </ul>
</nav>

总结:

分页比较简单,基本上有官网文档即可操作上手,但在进行筛选分页时耗了一点时间,记录一下,下次少走弯路

相关文章
|
7天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
37 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
3天前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
16 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
3天前
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
16 4
|
1天前
|
缓存 前端开发 Java
|
1天前
|
Linux Python
解决django项目报错很离谱的报错之RuntimeError: populate() isn't reentrant
解决django项目报错很离谱的报错之RuntimeError: populate() isn't reentrant
|
1天前
|
存储 Python
深度剖析:Python里字典树Trie的构建与查询,让你的代码更优雅!
在编程的世界里,数据结构的选择往往直接决定了程序的效率和可读性。今天,我们将深入探索一种高效处理字符串搜索与匹配的数据结构——字典树(Trie),也称作前缀树或单词查找树。通过Python实现Trie树,我们将看到它如何优雅地解决一系列字符串相关的问题,并提升代码的整体质量。
8 2
|
3天前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台。果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜'),然后基于TensorFlow库搭建CNN卷积神经网络算法模型,然后对数据集进行训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地文件方便后期调用。再使用Django框架搭建Web网页平台操作界面,实现用户上传一张果蔬图片识别其名称。
14 0
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
1月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
103 4
|
1月前
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
|
7天前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
55 21
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面