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 %}

详情页(略)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/861445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试系列】JavaScript 高频面试题

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

【八股系列】Vue中的<keep-alive>组件:深入解析与实践指南

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【探索响应式布局的奥秘&#xff1a;关键技术与实战代码示例】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&#x1f44d;收藏⭐评论…

正则表达式;grep、sed、awk、soft、uniq、tr 详解

正则表达式 概念 正则表达式&#xff08;Regular Expression&#xff0c;常简写为regex、regexp或RE&#xff09;是一种强大的文本处理工具&#xff0c;它使用一种特殊的字符序列来帮助用户检查一个字符串是否与某种模式匹配。 标准正则表达式 首先安装正则表达式pcre库 创…

C++ | Leetcode C++题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; class Solution { private:void dfs(vector<vector<char>>& grid, int r, int c) {int nr grid.size();int nc grid[0].size();grid[r][c] 0;if (r - 1 > 0 && grid[r-1][c] 1) dfs(grid, r - 1, c);if (r …

Shell 编程入门

优质博文&#xff1a;IT-BLOG-CN 【1】x.sh文件内容编写&#xff1a; 固定开头&#xff1a;#&#xff01;/bin/sh&#xff1b; 【2】学习的第一个命令就是echo输出的意思&#xff1b; 【3】其实shell脚本也就是在文件中写命令&#xff0c;但是我们要写的是绝对路径&#xff1a…

mysql岗位实习----教务系统管理

教务管理系统 一、DDL CREATE TABLE users (user_id int(11) NOT NULL AUTO_INCREMENT COMMENT 用户ID,username varchar(50) NOT NULL COMMENT 用户名,password varchar(255) NOT NULL COMMENT 密码,gender enum(男,女) NOT NULL COMMENT 性别,email varchar(100) DEFAULT N…

C++初学者指南第一步---14.函数调用机制

C初学者指南第一步—14.函数调用机制 文章目录 C初学者指南第一步---14.函数调用机制1.记住&#xff1a;内存的结构2.函数调用是如何工作的3. 不要引用局部变量4. 常见编译器优化5. Inlining内联 1.记住&#xff1a;内存的结构 堆&#xff08;自由存储&#xff09; 用于动态存…

解决Java中依赖注入的最佳实践

解决Java中依赖注入的最佳实践 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 引言 在Java开发中&#xff0c;依赖注入&#xff08;Dependency Injection&am…

Redis-实战篇-缓存雪崩

文章目录 1、缓存雪崩2、解决方案&#xff1a; 1、缓存雪崩 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 2、解决方案&#xff1a; 给不同的key的TTL添加随机值利用Redis集群提高服务的可用性…

华为电脑重装系统如何操作?电脑Win11系统重装注意什么?图文详细解答

随着科技的不断进步&#xff0c;操作系统更新换代的步伐也日益加快。华为电脑作为市场中的佼佼者&#xff0c;其搭载的Windows 11系统凭借其强大的性能和丰富的功能受到了用户的广泛好评。然而&#xff0c;随着使用时间的推移&#xff0c;系统可能会出现各种问题&#xff0c;如…

华为昇腾910B3 NPU训练最佳实践

作者: chuanzhubin, jintao 目录# 环境准备微调推理部署 环境准备# 实验环境&#xff1a;8 * 昇腾910B3 64G (设备由chuanzhubin提供, 感谢对modelscope和swift的支持&#xff5e;) # 创建新的conda虚拟环境(可选) conda create -n swift-npu python3.10 -y conda activate…

验证码技术 easy-captcha

依赖 <!-- easy-captcha用来生成验证码&#xff0c;由于jdk9以后&#xff0c;内置JavaScript去掉了&#xff0c;所以需要导入这个org.openjdk.nashorn --> <dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</arti…

牛客挑战赛75 D. 不存在的玩家(sg图dp)

题目 思路来源 灵茶山群群友 https://blog.csdn.net/Code92007/article/details/110354429 题解 其实想了想&#xff0c;和20年小米邀请赛决赛这个G题的dp思路是一样的&#xff0c;姑且称为sg图dp吧 按sg值从大到小dp&#xff0c;每次补上全局sg值-1的这些点&#xff0c; …

网约车停运损失费:2、协商过程

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…

AUTOSAR汽车电子嵌入式编程精讲300篇-智能网联汽车CAN总线-智能网联汽车车内网络

目录 2.1车内网络架构 2.2 CAN总线OSI七层模型 2.2.1 CAN总线物理层 2.2.2 CAN总线数据链路层 2.2.3 CAN总线应用层 2.3 车内网络威胁分析 本文篇幅较长,分为多篇,文章索引详见 智能网联汽车CAN总线-发展现状 智能网联汽车CAN总线-智能网联汽车车内网络 智能网联汽…

16、Spring~配置类

16、Spring~配置类 配置类源码解析ConfigurationClassPostProcessor类postProcessBeanDefinitionRegistry()方法processConfigBeanDefinitions()方法 ConfigurationClassUtils类checkConfigurationClassCandidate()方法 ConfigurationClassParser类parse()方法processConfigura…

数据赋能(131)——体系:数据转换——概述、关注焦点

概述 数据转换是指将数据从一种格式、结构或类型转换为另一种格式、结构或类型的过程。 数据转换操作属于数据整理过程。 它通常涉及数据清洗、数据映射、数据合并、数据拆分等操作&#xff0c;以确保数据的正确性和一致性。 数据转换的目的在于将原始数据转换为更易于处理…

Houdini 通过wedge来做模拟参数对比 (PDG TOP)

我们的设定如下例子 这是个简单的布料悬挂的例子。上方两个角分别被固定住了&#xff0c;然后在distance约束下布料下垂。 我们现在的目的是想要对比不同的streach stiffness对模拟的影响。 第一步&#xff1a;找到stiffness参数&#xff0c;右键expression->edit expre…

iis控制文件或者文件夹是否允许被访问

问题 出于数据或者网络安全&#xff0c;禁止扫描工具直接扫描到某些包含敏感信息的文件&#xff0c;尤其比如日志、配置&#xff0c;如何不写代码&#xff0c;使用iis处理呢&#xff1f; 假设有如下网站&#xff0c;访问http://localhost:6001/Logs/20240626.txt就会出现日志&…

AI开发Windows环境搭建

文章目录 1. GPU 支持检查2. 安装 Anaconda3. 创建 PyTorch 虚拟环境3.2 创建虚拟 PyTorchEnv 环境3.3 检查、激活、推出虚拟环境3.4 虚拟环境中python包管理3.5 虚拟环境中安装 PyTorch 框架 4. TensorFlow 安装 1. GPU 支持检查 打开 Task Manager (任务管理器&#xff09;&…