super_curd组件技术点总结
1.基于包的导入的方式实现单例模式
# test1.py
class AdminSite(object):
def __init__(self):
self.registry = {}
self.app_name = 'super_curd'
self.namespace = 'super_curd'
def register(self, model_class, stark_config):
if not stark_config:
stark_config = StarkConfig
self.registry[self.model_class] = stark_config[self.model_class]
site = AdminSite()
# test2.py
from test1 import site
site.register(model.UserInfo)
2.django中路由分发的原理
# 一般的
urlpatterns = [
url(r'^test/', views.test)
]
# 路由分发
urlpatterns = [
url(r'^test/', include('app_name.urls'))
]
# include原理:元组里面包含三个参数,[url],app_name,namespace
urlpatterns = [
url(r'^test/', (['这里面放url'], app_name, namespace))
]
3.钩子函数
class StarkConfig(object):
list_display = []
def __init__(self, model_class):
self.model_class = model_class
# 第一种钩子 - 在获取静态字段时,通过一个函数来间接获取,这样就能在获取字段之前进行自定义操作
def get_list_display(self):
return self.list_display
# 第二种钩子 - 组件中包含了很多已经设置好的url,在获取url时,自定义额外的url,
def extral_url(self):
pass
# 第三种钩子函数 - 利用装饰器,在生成url时,将request参数传递到当前类当中
import functools
def wrapper(func):
@functools.wraps(func)
def inner(request, *args, **kwargs):
self.request = request
return func(request, *args, **kwargs)
4.inclusion_tag对change_view功能进行拆分
- 实现方式:在app下新建一个名为templatetags文件夹,在里面新建一个py文件,里面写如下内容
# 具体代码
# stark.py
from template import Library
register = Library()
@register.inclusion_tag('stark/test.html')
def test(request):
pass
5.基于类的封装对chang_view功能进行拆分
- 以前的我们
# 在进行数据的存取时,通常使用[],{}等等,然后通过遍历的方法
data_list = [11,22,33]
for data in data_list:
print(data)
- 现在的我们
# 将数据存到类当中的字段中,这样在取数据时,我们只需要实例化一个对象,然后通过对象.的方式取数据
class Test(object):
def __init__(self, data_list):
self.data_list = data_list
t1 = Test()
t1.data_list
6.基于反射,通过传递进来的字符串动态调用函数
name_list = ['multi_delete', 'multi_init']
class Test(object):
name_list = ['multi_delete', 'multi_init']
def multi_delete(self):
pass
def multi_init(self):
pass
def get_name_list(self):
return self.name_list
def run(self):
name_list = self.get_name_list()
for name in name_list:
getattr(self, name)
7.通过_meta获取模型类的类名小写,以及对应的app名称
model.UserInfo._meta.model_name
model.UserInfo._meta.app_label
8.urlencode - 会将字典转换为字符串的方法
- 在python中有两种方式可以使用urlencode方法
# 第一种
from urllib.path import urlencode
# 第二种
from django.http import QueryDict
# 在django的请求中的QueryDict中
request.GET.urlencode # QueryDict中的数据会以`x1=1&x2=3&x3=5`的形式转换
request.POST.urlencode
9.make_safe
- 在后端我们想往前端传递含有前端格式的数据时,我们想让页面去渲染出我们的想要的效果
- 前端为什么不会直接渲染我们传递的字符串类型的前端代码,因为前端这样做事为了预防网站被恶意的进行xss攻击
- xss攻击 - 例子:我们在博客评论时,直接评论一段js代码,如果网站没有xss防护,那么网站就会执行这段js代码,我们就可以利用这个对网站进行恶意破坏,让网站无线弹窗之类的
10.autodiscover_module - 这个方法存在于django的admin源码当中
# 只要我们在某一个app下的apps.py中AppnameConfig类中实现这样一个方法,那么django每次启动之前,都会去app中找对应的py文件,然后将它运行
class StarkConfig(AppConfig):
name = 'stark'
def ready(self):
from django.utils.module_loading import autodiscover_modules
# 当程序启动时,去每个app目录下找stark.py并加载。
autodiscover_modules('stark')
11.基于类的继承,订制自己的config类,
- 当功能不能满足我们的需求时,我们可以继承原来的类,然后重写相关的方法对功能进行扩展
12.保留原来的筛选条件
- 当我们在页面上分页功能时,如果跳转到下一页,那么我们应该将搜索条件也要加入到下一页的数据中,这样对用户来说更加友好
- 当我们从筛选页面跳转到添加数据页面时,我们把条件一起给到我们跳转的页面。这样添加的页面在返回时,也要带上我们的筛选条件,这样我们就可以回到我们原来的带上筛选条件页面上。
- 基于QueryDict、urlencode来实现
13.深浅拷贝
- 在对QueryDict进行修改时,我们希望我们只修改自己的数据,保存到自己创建的一份QueryDict中,这时候就要用到深拷贝,这样做是为了不影响其他人使用QueryDict
14.QueryDict
在HttpRequest对象中,GET和POST属性都是一个django.http.QueryDict的实例。也就是说你可以按本文下面提供的方法操作request.POST和request.GET。
request.POST或request.GET的QueryDict都是不可变,只读的。如果要修改它,需要使用QueryDict.copy()方法,获取它的一个拷贝,然后在这个拷贝上进行修改操作。
15.yield
- 在大量的数据需要我们去传递时,我们可以一点一点的将数据传递出去,这样我们的内存当中存在的数据就不会过多,从而提升服务器的性能
16.Q对象
- 在django中,默认的filter并不能处理or这种情况,一旦我们需要构造复杂一点的查询语句时,就需要用到Q对象。
- 在Q对象中我们可以用or来包含and
con = Q()
con.connector = "OR"
if q:
for field in search_list:
con.children.append(('%s__contains' % field, q))
17.可迭代对象
- 什么是可迭代对象
- 实现了__inter__方法的对象就叫做可迭代对象。
- __inter__方法的作用就是返回一个迭代器对象。直观理解就是能用for循环进行迭代的对象就是可迭代对象。比如:字符串,列表,元祖,字典,集合等等,都是可迭代对象。
18.orm查询 - left join(左表查询) - inner join(内连接)
model.UserInfo.object.filter(id='lucas') -- inner join
model.UserInfo.object.filter(permission__is_null=Ture).values('id', 'title') -- left join
super_curd组件技术点总结的更多相关文章
- .Net 组件技术概述
1. 基本原理 组件是组件系统中功能的表现,没有组件就没有功能.特定接口是用于给组件管理程序来操纵.管理该组件,特定功能是组件需要完成的任务.在一个使用组件建立的产品中会随着功能数目的多少而会有多个组 ...
- vue项目实现按需加载的3种方式:vue异步组件技术、es提案的import()、webpack提供的require.ensure()
1. vue异步组件技术 vue-router配置路由,使用vue的异步组件技术,可以实现按需加载. 但是,这种情况下一个组件生成一个js文件. 举例如下: { path: '/promisedemo ...
- 微信团队分享:iOS版微信的高性能通用key-value组件技术实践
本文来自微信开发团队guoling的技术分享. 1.前言 本文要分享的是iOS版微信内部正在推广和使用的一个高性能通用key-value 组件的技术实践过程,该组件在微信内部被命名为MMKV(以下简称 ...
- 【VS开发】COM组件技术概述
这篇文章对COM做出来比较完整的解释,非常好. COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术.在COM构架下,人们可以开发出各种各样功能专一的组件,然后将它 ...
- Java Web编程的主要组件技术——Struts核心组件
参考书籍:<J2EE开源编程精要15讲> Struts配置文件struts-config.xml Struts核心文件,可配置各种组件,包括Form Beans.Actions.Actio ...
- Java Web编程的主要组件技术——Struts入门
参考书籍:<J2EE开源编程精要15讲> Struts是一个开源的Java Web框架,很好地实现了MVC设计模式.通过一个配置文件,把各个层面的应用组件联系起来,使组件在程序层面联系较少 ...
- Java Web编程的主要组件技术——MVC设计模式
参考书籍:<J2EE开源编程精要15讲> MVC(Model View Controller),Model(模型)表示业务逻辑层,View(视图)代表表述层,Controller(控制)表 ...
- COM组件技术名称解释
GUID:全局唯一标识. CLSID 或 ProgID :唯一地表示一个组件服务程序,那么根据这些ID,就可以加载运行组件,并为客户端程序提供服务了. IID :唯一的表示接口ID. COM 组件是运 ...
- Java Web编程的主要组件技术——Hibernate入门
参考书籍:<J2EE开源编程精要15讲> Hibernate是对象/关系映射(ORM,Object/Relational Mapping)的解决方案,就是将Java对象与对象关系映射到关系 ...
随机推荐
- 记一次基于springboot+aop实现日志记录实战
1. 为什么要记录日志 好处: a. 可以对一些重要功能进行记录,方便以后跟踪是谁操作此功能的. b. 在操作某些功能时可能会发生异常,但每次出现异常我们想定位日志都要去服务器查看我们的日志.有了日志 ...
- codeforces 875B
B. Sorting the Coins time limit per test 1 second memory limit per test 512 megabytes input standard ...
- Java 对象的哈希值是每次 hashCode() 方法调用重计算么?
对于没有覆盖hashCode()方法的对象 如果没有覆盖 hashCode() 方法,那么哈希值为底层 JDK C++ 源码实现,实例每次调用hashcode()方法,只有第一次计算哈希值,之后哈希值 ...
- web 前端工具: Gulp 使用教程
1 1 1 Gulp 使用教程: 1 1 1 1 1 1 1 1 ERROR: ./app.js 当前目录路径: ./ 当前目录路径: ./ 1 1 1 1 1 参考资源: http://webpac ...
- 如何通过 terminal 查看一个文件的 meta信息
如何通过 terminal 查看一个文件的 meta 信息 Linux shell stat 查看文件 meta 信息 stat stat指令:文件/文件系统的详细信息显示: 使用格式:stat 文件 ...
- Docker In Action
Docker In Action Docker 实战 https://docs.docker.com/get-started/overview/ Docker Engine Docker Archit ...
- React 16.x Roadmap
React 16.x Roadmap https://reactjs.org/blog/2018/11/27/react-16-roadmap.html https://reactjs.org/blo ...
- js online playground & web editor
js online playground & web editor -javascript playgrounds 2019 https://scotch.io/tutorials/7-jav ...
- flutter & dart & vs code & bug
flutter & dart & vs code & bug Waiting for another flutter command to release the startu ...
- Puppeteer: 虚拟键盘
文档 main.js const pptr = require('puppeteer'); const gotoUrl = 'http://127.0.0.1:5500/index.html'; (a ...