stark组件


1.介绍:

​ 快速完成对N张表增删改查+自定义复杂操作

2.单例模式

​ 类实例化单个对象

zhangsen.py
    class AdminSite(object):
        pass
    obj1 = AdminSite()

调用:
import zhangsen
#调用多次,只加载一次
zhangsen.object1
zhangsen.object1

3.启动后、路由加载之前定制一段代码(admin原理)

  1. 创建一个app组件

  2. 在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文件并加载。

  3. 那个app要使用stark组件,只需要创建stark.py

  4. 写在stark.py里面的内容 程序启动时便会先自动加载

stark组件执行流程

image-20210518084102125

yield

浪费内存,速度慢

image-20210518155144412

使用yield,提升效率。,循环一次,yield拿一次数据

image-20210518155041685

基本增删改查功能

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对象

  • 可迭代对象

  • image-20210524092743249

  • 封装

    • image-20210524094403140
    • 新封装
    • image-20210524094326800
  • 获取Fk、M2M、o2o、对应的表的所有数据(以Fk举例,其他都是一样的方法)

    • 表关系

    • image-20210524095121988

    • 函数

    • image-20210524095224919

      • 注意:django版本2.0之前使用 rel 2.0之后使用remote_field
  • 组合搜索

    -


文章作者: Kexuan Shi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Kexuan Shi !
评论
  目录