当前位置: 首页 > news >正文

Django-开发一个列表页面

需求

  1. 基于ListView,创建一个列表视图,用于展示"BookInfo"表的信息
  2. 要求提供分页
  3. 提供对书名,作者,描述的查询功能

示例展示:
在这里插入图片描述

1. 数据模型

models.py

class BookInfo(models.Model):title=models.CharField(verbose_name="书名",max_length=100)author=models.CharField(verbose_name="作者",max_length=100)desc=models.TextField(verbose_name="介绍")create_at=models.DateTimeField(verbose_name="创建时间",auto_now=True)update_at=models.DateTimeField(verbose_name="更新时间",auto_now_add=True)

2. 视图

views.py

from functools import reduce
from typing import Any
from django.shortcuts import render,redirect  
from django.db.models import Q
from django.views.generic import ListView
from django.views.generic.detail import DetailView
from .models import *
from .forms import *class BookListView(ListView):model=BookInfotemplate_name = "demo1/book_list.html"paginate_by = 10def get_queryset(self):title = self.request.GET.get('title')author = self.request.GET.get('author')content = self.request.GET.get('content')# 如果有任意参数不为空,则构建Q对象进行查询queries = [Q(titile__icontains=title) if title else Q(),Q(author__icontains=author) if author else Q(),Q(desc__icontains=content) if content else Q()]# 使用Q对象的&操作符组合查询条件queryset = BookInfo.objects.filter(reduce(lambda x, y: x & y, queries)) if queries else BookInfo.objects.all()return querysetdef get_context_data(self, **kwargs):context = super().get_context_data(**kwargs)# 保留查询参数到分页链接query_params = self.request.GET.copy()if 'page' in query_params:del query_params['page']  # 移除现有的页码参数以避免冲突paginator = context['paginator']page_numbers_range = 5  # 您可以根据需要调整显示的页码范围大小max_index = len(paginator.page_range)page = self.request.GET.get('page')current_page = int(page) if page else 1start_index = int((current_page - 1) / page_numbers_range) * page_numbers_rangeend_index = start_index + page_numbers_rangeif end_index >= max_index:end_index = max_indexpage_range = paginator.page_range[start_index:end_index]context['page_range'] = page_rangecontext['query_params'] = query_params.urlencode()  # 将查询参数编码为URL字符串return contextdef get(self, request, *args, **kwargs):# 如果是重定向回来的,需要处理paginate_by参数if 'paginate_by' in request.GET:try:paginate_by = int(request.GET['paginate_by'])if paginate_by > 0:  # 防止不合法的值self.paginate_by = paginate_byexcept ValueError:pass  # 如果转换失败,忽略错误,使用默认设置return super().get(request, *args, **kwargs)class BookDetailView(DetailView):model=BookInfotemplate_name = "demo1/book_detail.html"context_object_name = "book"

注册路由(urls.py)

from django.urls import path
from .views import *urlpatterns = [path("book",BookListView.as_view(),name="book-list"),path("book/detail/<int:pk>/",BookDetailView.as_view(),name="book-detail"),
]

3. 页面代码

列表页:

{% extends 'layout.html' %}{% block main %}<div class="panel panel-default"><div class="container"><form method="GET">检索:<input type="text" name="title" placeholder="书名" value="{{ request.GET.title }}"><input type="text" name="author" placeholder="作者" value="{{ request.GET.author }}"><input type="text" name="content" placeholder="内容关键字" value="{{ request.GET.content }}"><button type="submit">搜索</button>&nbsp; <a href="{% url 'book-list' %}" class="btn-sm btn-danger">清空查询条件</a></form></div><hr><div class="panel-body"><table class="table table-striped"><thead><tr><th>ID</th><th>书名</th><th>作者</th><th>说明</th><th>创建时间</th><th>更新时间</th><th>操作</th></tr></thead><tbody>{% for book in object_list %}<tr><td>{{ book.id }}</td><td>{{ book.titile }}</td><td>{{ book.author }}</td><td>{{ book.desc }}</td><td>{{ book.create_at }}</td><td>{{ book.update_at }}</td><td><a href="{% url 'book-detail' book.id %}">查看详情</a></td></tr>{% endfor %}</tbody></table>{% if is_paginated %}<div class="pagination"><p>第 {{ page_obj.number }} 页 / 共 {{ page_obj.paginator.num_pages }} 页</p><!-- 首页 -->{% if page_obj.has_previous %}<a href="?{{ query_params }}&page=1">首页</a>{% endif %}<!-- 上一页 -->{% if page_obj.has_previous %}<a href="?{{ query_params }}&page={{ page_obj.previous_page_number }}">上一页</a>{% endif %}<!-- 中间页码,显示首末3页及当前页附近的页码,其余用省略号表示 -->{% for num in page_obj.paginator.page_range %}{% if num == page_obj.number %}<span>{{ num }}</span> <!-- 当前页不做成链接 -->{% elif num >= page_obj.number|add:-2 and num <= page_obj.number|add:2 %}<a href="?{{ query_params }}&page={{ num }}">{{ num }}</a>{% elif num in page_obj.paginator.page_range|slice:":3" or num in page_obj.paginator.page_range|slice:"-3:" %}<a href="?{{ query_params }}&page={{ num }}">{{ num }}</a> <!-- 确保首末3页始终显示 -->{% elif num == page_obj.number|add:-3 or num == page_obj.number|add:3 %}<span>...</span>{% endif %}{% endfor %}<!-- 下一页 -->{% if page_obj.has_next %}<a href="?{{ query_params }}&page={{ page_obj.next_page_number }}">下一页</a>{% endif %}<!-- 尾页 -->{% if page_obj.has_next %}<a href="?{{ query_params }}&page={{ page_obj.paginator.num_pages }}">尾页</a>{% endif %}<!-- 当前页及总页数信息 --><!-- 跳转到指定页的表单 --><label for="jumpToPage">跳转到页数:</label><input type="number" id="jumpToPage" min="1"><button onclick="jumpToPage()">跳转</button></div></div>{% endif %}</div><script>function jumpToPage() {var jumpTo = document.getElementById('jumpToPage').value;var currentQueryParams = new URLSearchParams(window.location.search);if (jumpTo.trim() !== '') { // 确保输入有效// 保留现有查询参数,并添加或更新'page'参数currentQueryParams.set('page', jumpTo);window.location.href = window.location.pathname + '?' + currentQueryParams.toString();} else {alert('请输入有效的页数');}}</script>
{% endblock %}

详情页(略)

相关文章:

Django-开发一个列表页面

需求 基于ListView,创建一个列表视图,用于展示"BookInfo"表的信息要求提供分页提供对书名,作者,描述的查询功能 示例展示: 1. 数据模型 models.py class BookInfo(models.Model):titlemodels.CharField(verbose_name"书名",max_length100)authormode…...

flink 处理函数和流转换

目录 处理函数分类 概览介绍 KeydProcessFunction和ProcessFunction 定时器TimeService 窗口处理函数 多流转换 分流-侧输出流 合流 联合&#xff08;Uniion&#xff09; 连接&#xff08;connect&#xff09; 广播连接流&#xff08;BroadcatConnectedStream&#xf…...

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上&#xff0c;或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景&#xff1a; 表单…...

和利时SIS安全系统模块SGM210 SGM210-A02

和利时SIS安全系统模块SGM210 SGM210-A02 阀门定位器&#xff1a;&#xff08;福克斯波罗, YTC&#xff0c;山武&#xff09; PLC&#xff1a;&#xff08;西门子&#xff0c;施耐德&#xff0c;ABB,AB,三菱&#xff0c;欧姆龙&#xff09; 泵阀&#xff1a;&#xff08;力士…...

浔川3样AI产品即将上线!——浔川总社部

浔川3样AI产品即将上线&#xff01; 浔川AI翻译v3.0 即将上线&#xff01; 浔川画板v5.1 即将上线&#xff01; 浔川AI五子棋v1.4 即将上线&#xff01; 整体通告详见&#xff1a;浔川AI五子棋&#xff08;改进&#xff08;完整&#xff09;版1.3&#xff09;——浔川python社…...

小阿轩yx-MySQL索引、事务

小阿轩yx-MySQL索引、事务 MySQL 索引介绍 是一个排序的列表&#xff0c;存储着索引的值和包含这个值的数据所在行的物理地址数据很多时&#xff0c;索引可以大大加快查询的速度使用索引后可以不用扫描全表来定位某行的数据而是先通过索引表找到该行数据对应的物理地址然后访…...

搞定求职难题:工作岗位列表+简历制作工具 | 开源专题 No.75

SimplifyJobs/New-Grad-Positions Stars: 8.5k License: NOASSERTION 这个项目是一个用于分享和跟踪美国、加拿大或远程职位的软件工作机会列表。该项目的核心优势和关键特点如下&#xff1a; 自动更新新岗位信息便捷地提交问题进行贡献提供一键申请选项 BartoszJarocki/cv…...

JavaWeb——MySQL数据库:约束

目录 1. 约束 1.1 概念&#xff1a; 1.2 分类&#xff1a; 1.3 使用&#xff1a; 1.4 外键约束; 1.5 总结 数据库&#xff1a;数据库都有约束&#xff0c;数据库设计&#xff0c;多表查询&#xff0c;事物这四方面的知识&#xff1b; 我们先按这个顺序进行学习&#xff…...

JS(JavaScript)入门指南(DOM、事件处理、BOM、数据校验)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。 玉阶生白露,夜久侵罗袜。 却下水晶帘,玲珑望秋月。 ——《玉阶怨》 文章目录 一、DOM操作1. D…...

江协科技51单片机学习- p16 矩阵键盘

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…...

grpc学习golang版( 四、多服务示例)

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写Client客户端五、测试六、示例代码 一、前言 多服务&#xff0c;即一个rpc提供多个服务给外界调用…...

Linux安装jdk17

我们进入到cd /usr/lib/下然后创建一个jdk17的文件夹 mkdir jdk17 进入到jdk17目录下 下载jdk17包 上传到Linux 解压jar包 tar -zxvf jdk-17_linux-x64_bin.tar.gz压解完毕后 配置环境变量 vim/etc/profilei 修改 esc 退出 :wq保存 export JAVA_HOME/usr/lib/jdk17/jdk-1…...

Java家教系统小程序APP公众号h5源码

让学习更高效&#xff0c;更便捷 &#x1f31f; 引言&#xff1a;家教新选择&#xff0c;小程序来助力 在快节奏的现代生活中&#xff0c;家长们越来越注重孩子的教育问题。然而&#xff0c;如何为孩子找到一位合适的家教老师&#xff0c;成为了许多家长头疼的问题。现在&…...

PHP入门

一、环境搭建 无脑&#xff1a; 小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01;phpStudy官网2019正式推出phpStudy V8.0版本PHP集成环境&#xff0c;支持Windows与Linux系统&#xff0c;支持WEB面板操作管理&#xff0c;一键网站开发环境搭建配置&#xff0c;…...

docker ce的使用介绍

docker docker17.03以后 docker ce&#xff0c;社区免费版&#xff0c;vscode的docker插件使用的该版本&#xff08;默认windows只支持windows容器&#xff0c;linux支持linux容器&#xff09;docker ee&#xff0c;企业版本 docker17.03以前 docker toolbox&#xff0c;基于…...

SpringCloud Alibaba Sentinel 流量控制之流控模式实践总结

官网文档&#xff1a;https://sentinelguard.io/zh-cn/docs/flow-control.html wiki地址&#xff1a;https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6 本文版本&#xff1a;spring-cloud-starter-alibaba&#xff1a;2.2.0.RELEASE 如下图所…...

【高考志愿】电子科学与技术

高考志愿选择电子科学与技术专业&#xff0c;无疑是向着科技创新的前沿迈出坚定步伐的明智之选。这一专业以其深厚的理论基础、前沿的技术应用和广泛的就业前景&#xff0c;吸引了众多有志于投身科技领域的学子。 首先&#xff0c;电子科学与技术专业所涵盖的内容丰富而深入。它…...

2024.06.26【读书笔记】|医疗科技创新流程(前言)【AI增强版】

目录 《BIODESIGN》第二版前言详细总结前言概述新增重要内容价值导向 (Value Orientation)全球视角 (Global Perspectives)更好的教学和学习方法 (Better Ways to Teach and Learn)全新视频集合 (New Videos)扩展的“实地”案例研究 (Expanded “From the Field” Case Studies…...

kubernetes Job yaml文件解析

一、yaml文件示例 apiVersion: batch/v1 kind: Job metadata:name: test-jobnamespace: mtactor spec:completions: 3parallelism: 1backoffLimit: 5activeDeadlineSeconds: 100template:spec:containers:- name: test-jobimage: centoscommand: ["echo","test…...

php goto解密脚本源码

php goto解密脚本源码 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89426171 更多资源下载&#xff1a;关注我。...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

js 设置3秒后执行

如何在JavaScript中延迟3秒执行操作 在JavaScript中&#xff0c;要设置一个操作在指定延迟后&#xff08;例如3秒&#xff09;执行&#xff0c;可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法&#xff0c;它接受两个参数&#xff1a; 要执行的函数&…...

简单聊下阿里云DNS劫持事件

阿里云域名被DNS劫持事件 事件总结 根据ICANN规则&#xff0c;域名注册商&#xff08;Verisign&#xff09;认定aliyuncs.com域名下的部分网站被用于非法活动&#xff08;如传播恶意软件&#xff09;&#xff1b;顶级域名DNS服务器将aliyuncs.com域名的DNS记录统一解析到shado…...