Django-开发一个列表页面

2024-06-30 1401阅读

需求

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

示例展示:

Django-开发一个列表页面

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=BookInfo
    template_name = "demo1/book_list.html"
    paginate_by = 10
    def 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 queryset
    def 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 1
        start_index = int((current_page - 1) / page_numbers_range) * page_numbers_range
        end_index = start_index + page_numbers_range
        if end_index >= max_index:
            end_index = max_index
        page_range = paginator.page_range[start_index:end_index]
        context['page_range'] = page_range
        context['query_params'] = query_params.urlencode()  # 将查询参数编码为URL字符串
        return context
    def 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_by
            except ValueError:
                pass  # 如果转换失败,忽略错误,使用默认设置
        return super().get(request, *args, **kwargs)
class BookDetailView(DetailView):
    model=BookInfo
    template_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//",BookDetailView.as_view(),name="book-detail"),
]

3. 页面代码

列表页:

{% extends 'layout.html' %}
{% block main %}
    
检索:
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]