初学Django基础03 分页,django后台,form表单校验及ModelForm
django几种自带的几种模块
分页
# 导入分页 from django.core.paginator import Paginator # 专门做分页的 le = list(range(100)) # 对整个分页做操作 page_obj = Paginator(le, 20) # 参数一为一个list,参数二为显示多少条 print(page_obj.count) # 查询分页总共多少条数据 print(list( page_obj.get_page(2))) # 获取第几页的数据 [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39] print(page_obj.object_list) # 原始的数据 print(page_obj.num_pages) # 总共分了几页 print(page_obj.page_range) # 分页范围 # 对单独页做操作 page6 = page_obj.get_page(6) print(page6.has_next()) # 返回布尔值,是否有下一页的数据 page6.has_other_pages() # 是否有其他页,判断是否需要分页 page6.has_previous() # 是否有上一页 page6.next_page_number() #下一页的页码,注意没有会报错 page6.previous_page_number() #上一页的页码,注意没有会报错 page6.end_index() # 首页页码 page6.start_index() # 末尾页页码 print(page6.paginator) # 获取整个分页的对象 print(page6.number) # 获取当前的页码
django的后台管理
django后台在默认已经配置
# url.py
urlpatterns = [ path('admin/', admin.site.urls),]
python manage.py createsuperuser # 第一次进入时需要为django添加超级管理员用户
admin后台数据管理,添加对应的表
# admin.py from django.contrib import admin # Register your models here. from . import models # 增加models里面的所有表,这样做django会在后台自动创建对表的增删改查管理 admin.site.register(models.Nav) # register注册对应的表 admin.site.register(models.Article)
但是这些仅仅不够,往往后台的表是能够展示指定的字段并对进行增删改查的,所以我们在上面基础上补充一些
from django.contrib import admin # Register your models here. from . import models class ArticleAdmin(admin.ModelAdmin): # 必须继承admin.ModelAdmin,其封装了一些管理选项和功能,下面的类方法都是固定格式 list_display = ['id', 'title', 'img', 'nav'] # list_display需要显示的字段 search_fields = ['title', 'content'] # 需要实现搜索功能的字段 list_per_page = 5 # 每页显示5条数据 list_filter = ['nav'] # 筛选过滤器 class NavAdmin(admin.ModelAdmin): list_display = ['id', 'name', 'is_delete', 'create_time', 'update_time'] search_fields = ['name'] list_per_page = 10 admin.site.register(models.Article, ArticleAdmin) # 注册时加上参数(表结构类,刚刚添加的类) admin.site.register(models.Nav, NavAdmin)
#使用装饰器的形式添加 @admin.register(models.Nav) class NavAdmin(admin.ModelAdmin): list_display = ['id', 'name', 'is_delete', 'create_time', 'update_time'] search_fields = ['name'] list_per_page = 10
扩展
@admin.register(models.Student) class StudentAdmin(admin.ModelAdmin): # 编辑/新增详情页 exclude = ['money'] # 排除新增/编辑页面需要显示的字段 fields = ['name', 'phone'] # 新增/编辑页面需要显示的字段 # 列表页 list_display = ['phone', 'money', 'create_time', 'update_time', 'status', 'Email', 'is_delete'] list_display_links = ['phone', 'Email'] # 指定哪些在列表页显示的字段上加链接,快速进入编辑页面 search_fields = ['phone'] list_per_page = 10 ordering = ['create_time'] # 排序, 影响order_by date_hierarchy = 'create_time' # 在列表页上面添加规则,一般用于过滤时间字段 # 自定义操作 actions_on_top = True # 指定列表页按钮的是否在上边, 设置为True则在上面,默认为actions_on_top = True # actions_on_bottom = True # 和actions_on_top一样,只不同在下方 def fun1(self): '''do some thing...''' def fun2(self): '''do some thing...''' def fun3(self, request, queryset): # 参数一,所有请求相关,参数二,操作数据的对象,我们可以进行queryset.filter()取数据 queryset.update(status=1) # 把status字段变为1 def fun4(self, request, queryset): queryset.update(status=0) # 把status字典变为0 fun3.short_description = '启用' # short_description后台显示的名称 fun4.short_description = '停用' # 自定义删除变为非物理删除(当我们在后台删除数据后,后台数据真的会被删除,这称为物理删除,而生产环境我们需要建一个字段is_delete区分) admin.site.disable_action('delete_selected') # 禁用默认的删除操作 def del_fun(self, request, queryset): # 重新定义 queryset.update(is_delete=0) actions = [fun1, fun2, fun3, fun4] # 自定义函数,在列表页会动作栏会看到函数名,点击执行函数就会被触发了 # 加入到action列表中 admin.site.add_action(del_fun, '删除用户') # 注册到admin站点中 # 我们发现被删除的用户还显示在列表页,所有我们需要重写获取django获取列表页的方法 def get_queryset(self, request): queryset = super().get_queryset(request) return queryset.filter(is_delete=1)
django form表单数据校验
先构建学生表,做一个添加学生的信息,校验请求传给后台的例子
# models.py class Student(models.Model): name = models.CharField(verbose_name='名称', max_length=10) phone = models.CharField(max_length=11, unique=True, verbose_name='手机号') money = models.FloatField(verbose_name='钱', default=0, null=True) class Meta: verbose_name = '学生表' verbose_name_plural = verbose_name db_table = 'student' def __str__(self): return self.name
之后我们要在view.py中写校验逻辑了,之前我们会这样写,这是比较繁琐的做法↓
# view.py
def Student(request): #之前的实现 name = request.POST.get('name') phone = request.POST.get('phone') money = request.POST.get('money') if name and phone and money: data = {'status':'1','msg':'通过'} else: data = {'status':'0','msg':'不通过'} return HttpResponse(json.dumps(data))
django作为一个10多年的成熟框架有了自己的校验,来看看django form的实现↓
# view.py
from django import forms class StudentForm(forms.Form): name = forms.CharField(min_length=2, max_length=10, required=True) # required必传值,默认为必传,min_length最小值,max_length最大值 phone = forms.CharField(min_length=11, max_length=11) money = forms.FloatField() def clean_phone(self): # 钩子函数,django在校验时也会对钩子函数校验(clean_加字段名开头的),针对单个字段进行校验 phone = self.cleaned_data['phone']
...
def clean(self): # 钩子函数,直接写clean是对上面的name,phone,money,所有字段都可以进行校验
phone = self.cleaned_data['phone']
name = self.cleaned_data['name']
money = self.cleaned_data['money']
...
def Student(request): stu_form = StudentForm(request.POST) # 实例化 if stu_form.is_valid(): # 是否符合校验结果 true_data = stu_form.cleaned_data # 拿到校验通过的数据,返回的是一个字典 data = {'msg': '校验成功', 'dat': true_data} models.Student.objects.create(**true_data) # 添加到数据库中 else: print('error', stu_form.errors) # 返回html的页面展示结果 print('error', stu_form.errors.get_json_data()) # 返回json类型数据 data = {'msg': '校验失败'} return HttpResponse(json.dumps(data, ensure_ascii=False))
继承方法,ModelForm会自动验证models.py的student结构表,这样连写form都省了
# view.py from .models import Student from django.forms import ModelForm class StudentForm(ModelForm): class Meta: model = Student #建立验证关系 fields = '__all__' #代表验证所有的字段 # fields = ['name','phone'] #验证指定字段 # exclude = ['money'] #验证所有字段排除这个字段