java中的接口是类吗
616
2022-08-23
Python-Django 项目模块-年级模块开发(七)(pythondjango框架)
Python-django 自定义模块开发-列表展示
第四章 Django 自定义模块-年级模块开发过程
前言
本系列文章以一个简单的学校项目来做演示,项目中遇到的问题会一一记录下来,仅供学习参考使用
此处学习版本 python3.8 django 4.0.6 bootstrap3 开发工具 VSCODE
一、创建静态页面-年级首页
对应的路径:school\school_web_grade\templates\grade\grade_index.html
先创建页面 我再解释 其中的用法
1.指定国际化
{% load i18n static %}
2.指定静态文件引用地址{% static '' %} 固定写法
{% static 'bootstrap-3.4.1/css/bootstrap.min.css' %}陕西家里蹲大学师生信息管理系统
3.对应的url请求写法
{% url 'school_web_grade:index'%}其中 {% url 'x:y'%} 为固定写法 “x:y”号中是对应的模块:对应的方法名
4.对应url请求参数
5.数据的展示
{% for grade in gradeList %}二、后端代码编写
1.创建实体类 model.py
from django.db import models'''模型定义类'''# Create your models here.'''年级类'''class SchoolGrade(models.Model): ''' erbose_name: str | None = ..., 备注字段名 name: str | None = ..., primary_key: bool = ..., 是否主键 如果设置为 True ,将该字段设置为该模型的主键 max_length: int | None = ..., 最大长度 unique: bool = ..., 是否唯一 blank: bool = ..., 是否为空 null: bool = ...,是否为null db_index: bool = ..., 数据索引 rel: ForeignObjectRel | None = ..., default: Any = ..., 默认值 editable: bool = ..., serialize: bool = ..., 是否序列化 unique_for_date: str | None = ..., 唯一日期 unique_for_month: str | None = ..., 唯一月 unique_for_year: str | None = ..., 唯一年 choices: _FieldChoices | None = ..., help_text: str = ..., 这个字段设置后 随 表单一起显示 db_column: str | None = ..., 数据库列 db_tablespace: str | None = ..., 数据库表空间 auto_created: bool = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesT | None = ... ''' ## 自动生成值得列 如果不设置 primary_key 则会自动生成一个 id 字段 添加到此模型中作为主键自动生成 grade_id = models.BigAutoField(unique=True,serialize=True,primary_key=True,null=False,blank=False,verbose_name="年级表主键") ## 设置年级名称 max_length 最大长度为500 grade_name = models.CharField(max_length=500,verbose_name="年级名称") ## 设置创建时间 grade_create_date = models.DateTimeField(auto_now_add=True,verbose_name="创建时间") ## 设置修改时间 grade_update_date = models.DateTimeField(auto_now_add=True,verbose_name="修改时间")
2.生成数据库表
执行命令:
python .\manage.py makemigrations school_web_gradepython .\manage.py migrate
3.创建业务调用类 views.py
方法中有部分参数的说明和用法,自己可以进行尝试
import datetimefrom django.shortcuts import redirect, renderfrom django.views import generic## python 分页from django.core.paginator import Paginator## 引入 年级模型from .models import SchoolGrade# Create your views here.## 调用视图的方法类'''通用视图类 默认主页'''class IndexView(generic.ListView): ## 调用的视图 template_name="index.html" ## 此方法必须有 返回None 都可以 def get_queryset(self): return None'''方法实现'''def index(request): return render(request=request,template_name="index.html")'''年级管理'''## 年级首页def gradeIndex(request,pageIndex): page_index = pageIndex print(page_index) object_list = [] grade_name = "" if request.method == "POST": ## 获取数据的方法 grade_name = request.POST.get("grade_name") print(grade_name) ## 修改时间 # grade_update_date = datetime.datetime.now() ## __contains like 查询 object_list = SchoolGrade.objects.filter(grade_name__contains=grade_name).order_by("grade_create_date") else: ## 查询年级数据 object_list = SchoolGrade.objects.order_by("grade_create_date") # ## 获取总行数 # count = SchoolGrade.objects.order_by("grade_create_date").count() # print("获取总行数",count) ''' object_list: _SupportsPagination, 数据列表 per_page: int | str, 每页显示的条数 orphans: int = ..., 可选的。当你不希望最后一页的项目数量很少时,使用这个选项。如果最后一页的项目数量通常小于或等于 orphans,那么这些项目将被添加到前一页(成为最后一页),而不是让这些项目单独留在一页上。例如,如果有 23 个条目,per_page=10,orphans=3,则会有两页;第一页有 10 个条目,第二页(也是最后一页)有 13 个条目。orphans 默认为 0,这意味着页面永远不会合并,最后一页可能只有一个项目。 allow_empty_first_page: bool = ... 是否允许页面为空 ''' ## 每页显示的条数 必要的。一个页面中包含的最大项目数 per_page = 2 ## 可选的。是否允许第一页为空。 如果 False 并且 object_list 是空的,则会出现 EmptyPage 错误 allow_empty_first_page = True paginator = Paginator(object_list=object_list,per_page=per_page,allow_empty_first_page=True) # print("paginator",paginator) ## 读取当页数据对象 currentGradePage = paginator.page(page_index) gradeList = currentGradePage.object_list ## 获取查询页的数据 # for a in currentGradePage.object_list: # print(a) print("paginator.count-总行数",paginator.count) print("paginator.count-总页数",paginator.num_pages) ## 以 1 为基础的页码范围迭代器 print("paginator.count-以1为基础循环",paginator.page_range) ''' 返回页码 列表 number: int | float | str = ..., *, on_each_side: int = ..., on_ends: int = ... ''' # iterators = paginator.get_elided_page_range(1,on_each_side=3,on_ends=2) # for p in iterators: # print(p) # ## 输入页码 返回 page对象 # page = paginator.get_page(1) # print(page) # ## 如果有下一页,返回 True。 # has_next = page.has_next() # print("has_next:",has_next) # ## 如果有上一页返回true # has_previous = page.has_previous() # print("has_previous:",has_previous) # ## 如果有 上一页或者下一页 返回true # has_other_pages = page.has_other_pages() # print("has_other_pages:",has_other_pages) # ## 返回下一页的页码。如果下一页不存在,则引发 InvalidPage # next_page_number = page.next_page_number() # print("next_page_number:",next_page_number) # ## 返回上一页的页码。如果上一页不存在,则引发 InvalidPage # previous_page_number = page.previous_page_number() # print("previous_page_number:",previous_page_number) # ## 返回页面上第一个对象,相对于分页器列表中所有对象的基于 1 的索引。例如,当对一个有 5 个对象的列表进行分页时,每页有 2 个对象,第二页的 start_index() 将返回 3 # start_index = page.start_index() # print("start_index:",start_index) # ## 返回页面上最后一个对象相对于分页器列表中所有对象的基于 1 的索引。例如,当对一个有 5 个对象的列表进行分页时,每页有 2 个对象,第二页的 end_index() 将返回 4 # end_index = page.end_index() # print("end_index:",end_index) # print(pageIndex) ## 保存变量 context = {"gradeList":gradeList,"currentGradePage":currentGradePage,"pageIndex":pageIndex,"grade_name":grade_name} return render(request=request,template_name="grade/grade_index.html",context=context,content_type='text/html')
4.配置路由地址 urls.py
"""school_web_grade URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see: views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home')Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))"""from django.contrib import adminfrom django.urls import pathfrom django.urls import includefrom . import views## 模块名称 url命名空间app_name = "school_web_grade"'''path(route: str, route 是一个匹配 URL 的准则(类似正则表达式)view: (...) -> HttpResponseBase,当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个 HttpRequest 对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入kwargs: Dict[str, Any] = ...,任意个关键字参数可以作为一个字典传递给目标视图函数name: str = ...为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式'''urlpatterns = [ ## 默认主页 path(route="",view=views.IndexView.as_view(),name="index"), ## 年级模块 path(route="gradeIndex/
5.注册 school\school_web_grade\admin.py
from django.contrib import admin# Register your models here.## 向管理网站注册当前创建的模型from .models import SchoolGrade## 年级类admin.site.register(SchoolGrade)
6.运行项目
总结
初次运行 数据是不存在的 因为没有对数据库进行添加数据操作 ,下一节专门介绍下 新增
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~