1.介绍:
快速完成对N张表增删改查+自定义复杂操作
2.单例模式
类实例化单个对象
zhangsen.py
class AdminSite(object):
pass
obj1 = AdminSite()
调用:
import zhangsen
#调用多次,只加载一次
zhangsen.object1
zhangsen.object1
3.启动后、路由加载之前定制一段代码(admin原理)
创建一个app组件
在app.py编写ready方法
from django.apps import AppConfig class StarkConfig(AppConfig): name = 'stark' def ready(self): from django.utils.module_loading import autodiscover_modules autodiscover_modules('stark') #注意:注册路由必须按照django1的注册规范 'stark.apps.StarkConfig'
程序启动后,会先去每个app中找stark.py文件并加载。
那个app要使用stark组件,只需要创建stark.py
写在stark.py里面的内容 程序启动时便会先自动加载
stark组件执行流程
yield
浪费内存,速度慢
使用yield,提升效率。,循环一次,yield拿一次数据
基本增删改查功能
N张表,添加时只需要在相应app下的stark文件添加 site.register(表名,自定制类)
可定制:
1,排序规则
第一种方法
class RoleConfig(StarkConfig): order_by = ['id'] list_display = [StarkConfig.display_checkbox,'id','title',StarkConfig.display_edit_del] site.register(models.Role,RoleConfig)
第二种(更灵活)
class RoleConfig(StarkConfig): list_display = [StarkConfig.display_checkbox,'id','title',StarkConfig.display_edit_del] def get_order_by(self): return ['[-id'] site.register(models.Role,RoleConfig)
2.显示列
第一种
class RoleConfig(StarkConfig): list_display = [StarkConfig.display_checkbox,'id','title',StarkConfig.display_edit_del] site.register(models.Role,RoleConfig)
第二种(更灵活)
class RoleConfig(StarkConfig): def get_list_display(self): return [StarkConfig.display_checkbox,'id','title',StarkConfig.display_edit_del] site.register(models.Role,RoleConfig)
3.显示添加按钮
class RoleConfig(StarkConfig): list_display = [StarkConfig.display_checkbox,'id','title',StarkConfig.display_edit_del] def get_add_btn(self): #显示 return mark_safe('<a href="%s" class= "btn btn-success">添加</a>' % self.reverse_add_url()) #不显示 return None site.register(models.Role,RoleConfig)
4.定制ModelForm
第一种
class DepartModelForm(forms.ModelForm): class Meta: model = models.Depart fields = '__all__' def clean_name(self): return self.cleaned_data['name'] class DepConfig(StarkConfig): list_display = [StarkConfig.display_checkbox ,'id','title',StarkConfig.display_edit_del] model_form_class = DepartModelForm
第二种
class DepartModelForm(forms.ModelForm): class Meta: model = models.Depart fields = '__all__' def clean_name(self): return self.cleaned_data['name'] class DepConfig(StarkConfig): list_display = [StarkConfig.display_checkbox ,'id','title',StarkConfig.display_edit_del] def get_model_form_class(self): return DepartModelForm
5.自定义列表(其他)页面
class RoleConfig(StarkConfig): order_by = ['id'] list_display = [StarkConfig.display_checkbox,'id','title',StarkConfig.display_edit_del] def changelist_view(self, request): return HttpResponse('自定制列表') site.register(models.Role,RoleConfig)
6.增加URL
class RoleConfig(StarkConfig): order_by = ['id'] list_display = [StarkConfig.display_checkbox,'id','title',StarkConfig.display_edit_del] def extra_url(self): data = [ path('xxx/',self.xxx) ] return data def xxx(self,request): print('....') return HttpResponse('xxxx') site.register(models.Role,RoleConfig)
Day13
批量操作
反射
__name__
获取函数名以切皆对象
def multi_delete(self, request): pk_list = request.POST.getlist('pk') self.model_class.objects.filter(pk__in=pk_list).delete() # return HttpResponse('删除成功') multi_delete.text = '批量删除'
搜索
- Q
- __contains
保留搜索原条件
- QueryDict,request.GET/request.POST
- urlencode()
- _mutable = True
- 深拷贝
- urllib.parse.urlencode
f分页
- 保留原条件
- 分页组件
拆分
- ChangeList类封装
- inclusion_tag
- 生成器(yield)
内容回顾
1.三个类
- ChangeList :由于列表页面视图函数拥到变量太多,所以把一些变量封装到这里面
- StarkConfig :生成最终URL和视图对应关系 +默认配置
- AdminSite :路由分发,保存数据库类和处理该数据类的对象的对应关系
- _regirstry = {]
2.知识点
inclusion_tag
urlencode
_meta.model_name
_meta.model_label
深浅拷贝
QueryDict对象不可改 _mutable=True才可改
生成器
路由分发
- include
- ([],None,None)
函数和方法的区别
Q对象 :模糊查询,搜索 作用:构造复杂的查询条件
model.User.object.filter(name__contains='李') model.User.object.filter(name__contains='李',email__contains='李') #不符合搜索条件 构成 and
使用Q构造 #####构造查询多个字段共有“李”字的数据######## c1=Q() c1.connector = "OR" c1.children.append(('name__contains','李')) c1.children.append(('email__contains','李')) model.User.object.filter(c1) #####构造查询id>2和age<=5的数据######## c2=Q() c2.connector = "ADN" c2.children.append(('id__gt',2)) c2.children.append(('age__lte',5)) model.User.object.filter(c2) #####构造查询 多个字段共有“李”字的数据 和 id>2和age<=5的数据######## c1=Q() c1.connector = "OR" c1.children.append(('name__contains','李')) c1.children.append(('email__contains','李')) c2=Q() c2.connector = "ADN" c2.children.append(('id__gt',2)) c2.children.append(('age__lte',5)) c3=Q() c3.connector = "ADN" c3.add(c1,"ADN") c3.add(c2,"ADN") #(name='李' or email='李') and (id>2 and age<=5) model.User.object.filter(c3)
反射
list_display row.name getattr(row,'name') action: pass
继承
class RoleConfig(StarkConfig): pass
反向生成url
reverse('xxx') reverse('namespace:xxx')
分页(保留搜索条件)
ModelForm组件
functools.wraps,用于保留原函数的元信息(函数名/函数注释等信息)
钩子预留函数(预留可扩展位置)
request.GET
- request.GET.get(‘x’)
- request.GET[‘x’]
- request.GET.copy
- request.GET.urlencode()
- request.GET._mutable = True
- request.GET.getlist(‘xxx’)
mark_safe
- xss攻击
单例模式
- 如果想要做某一件事或者操作某一个数据或者一堆数据用单列
获取函数名
__name__
autodiscover_module 当程序启动起来,去每个app模块下找模块
装饰器
QueryDict对象
可迭代对象
封装
- 新封装
获取Fk、M2M、o2o、对应的表的所有数据(以Fk举例,其他都是一样的方法)
表关系
函数
- 注意:django版本2.0之前使用
rel
2.0之后使用remote_field
- 注意:django版本2.0之前使用
组合搜索
-