statrc部分
statrc部分
1. 如何使用
#- 在app中编写 stark.py
#- 在stark.py中进行定制
#- 默认配置:
#site.register(models.UserInfo)
#- 自定义配置:
#class UserConfig(StarkConfig):
#list_display = [] # 表格式列表上显示的字段
#def get_list_display():
#order_by = [] # 排序
#action_list=[] # 批量操作
#search_list = [] # 模糊搜索
#list_filter = [] # 组合搜索
#add_btn # 是否显示添加按钮
#model_form_class # 自定义ModelForm
#def extra_url(self): # 自定义扩展 URL
#def get_urls(self): # 自定义URL
#def changelist_view(self,request):
#def add_view(self,request):
#def change_view(self,request):
#def del_view(self,request):
#site.register(models.UserInfo,UserConfig)
1. 类当做key
2. django中的model所在app名称、以及小写类名。
#def index(request):
# #print(m1.UserInfo,m1.UserInfo._meta.app_label,m1.UserInfo._meta.model_name)
# #print(m2.Role,m2.Role._meta.app_label,m2.Role._meta.model_name)
# 获取当前models类所在app名称、以及小写类名。
_registry = {
m1.UserInfo:'',
m2.Role:'',
}
for k,v in _registry.items():
print(k._meta.app_label,k._meta.model_name) return HttpResponse('...')
1. stark介绍
快速完成对N张表增删改查+自定义复杂操作。
2. 单例模式
我们这么写:
zhaosen.py
class AdminSite(object):
pass obj1 = AdminSite()
调用实例:
import zhaosen
zhaosen.obj1
zhaosen.obj1
单例模式
3. 路由系统
- include
- namespace - 补充:
项目/urls.py
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^rbac/', ([
url(r'^login/', views.login),
url(r'^logout/', views.logout),
url(r'^x1/', ([
url(r'^add/', views.add,name='n1'),
url(r'^change/', views.change,name='n2'),
],None,'xxx')),
],None,'rbac')),
] app01/views.py
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.urls import reverse def login(request):
url1 = reverse('rbac:xxx:n1')
url2 = reverse('rbac:xxx:n2') print(url1)
print(url2)
return HttpResponse('login') def logout(request):
return HttpResponse('logout') def add(request):
return HttpResponse('add') def change(request):
return HttpResponse('change')
路由
4. 启动后、路由加载前定制一段代码。
a. 创建一个stark app 组件 b. 编写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') 程序启动时,会先去每个app中找stark.py文件并加载。 c. 其他app中创建stark.py d. 程序启东时便会自动加载 stark.py
1. 继承关系
class StarkConfig(object):
list_display = [] def __init__(self,model_class):
self.model_class = model_class def changelist_view(self,request):
print(self.list_display)
return 123 class RoleConfig(StarkConfig):
list_display = ['id','name'] obj1 = StarkConfig('alex')
obj2 = RoleConfig('oldboy') obj1.changelist_view(1) # []
obj2.changelist_view(2) # [id,name]
1. 方法和函数的区别?
from types import MethodType,FunctionType
def check(arg):
"""
判断arg是函数则打印1,arg是方法则打印2
:param arg:
:return:
"""
if isinstance(arg,MethodType):
print(2)
elif isinstance(arg,FunctionType):
print(1)
else:
print('不认识') def func():
pass class Foo(object):
def display(self):
pass check(func)
check(Foo.display)
check(Foo().display)
yield
def get_result(data_list): for row in data_list:
temp = "%s%s" (row.name,row.pwd,)
yield temp def func(request): data_list = models.Users.objects.all()
result = get_result(data_list) return render(request,'xxx.html',{'result':result}) xxx.html {% for row in result %}
{{row}}
{% endfor%}
3. getattr
def test(request):
from app01 import models list_display = ['id','title']
user_queryset = models.UserInfo.objects.all()
for item in user_queryset:
row = []
for field in list_display:
row.append(getattr(item,field))
print(row) return HttpResponse('...') 补充:自定义页面显示列 def test(request):
from app01 import models list_display = ['id','title'] header_list = []
for name in list_display:
header_list.append(models.UserInfo._meta.get_field(name).verbose_name)
print(header_list) user_queryset = models.UserInfo.objects.all()
for item in user_queryset:
row = []
for field in list_display:
row.append(getattr(item,field))
print(row) return HttpResponse('...')
3.5 装饰器
import functools def wrapper(func):
@functools.wraps(func)
def inner(*args, **kwargs):
return func(*args, **kwargs)
return inner @wrapper
def f1():
print('f1') @wrapper
def f2():
print('f1') print(f1.__name__)
print(f2.__name__)
1. 静态字段和字段
class Foo:
x = 1 # 类变量、静态字段、静态属性 def __init__(self):
y = 6 # 实例变量、字段、对象属性 # 实例方法
def func(self):
pass # 静态方法
@staticmethod
def func():
pass # 类方法
@classmethod
def func():
pass @property
def start(self)
pass
2. 函数
#获取函数的名字,可通过 函数.__name__
3. urlencode
info = {'k1':'v1','k2':'v2'} from urllib.parse import urlencode info = {'k1':'v1','k2':'v2','k3':'v3'} v = urlencode(info)
print(v)
4.django中使用 request.GET --> QueryDict
import copy def test(request):
from django.http.request import QueryDict
print(request.GET) # <QueryDict: {'k2': ['v2', 'v3'], 'k1': ['v1']}> # params = copy.deepcopy(request.GET)
params = request.GET.copy()
params._mutable = True
params['k1'] = 666
params['k3'] = 78
params.setlist('k4',[10,12])
print(params['k2']) # request.GET.get('xx') old = params.getlist('k2')
old.append('v4')
params.setlist('k2',old) # v1 = params.urlencode()
# print(v1) # k1=v1&k2=v2&k2=v3
print(params)
return HttpResponse('...')
5. 保留原来搜索条件
def test(request):
from django.http.request import QueryDict
url_params_str = request.GET.urlencode() # _filter = k1=v1&k2=v2&k2=v3 query_dict = QueryDict(mutable=True)
query_dict['_filter'] = url_params_str new_params = query_dict.urlencode() target_url = "/add_stu/?%s" %new_params
return redirect(target_url) def add_stu(request): if request.method == "GET":
return render(request,'add_stu.html')
# 接收到数据,保存到数据库
origin_params = request.GET.get('_filter')
back_url = "/test/?%s" %origin_params
return redirect(back_url)
6. name包含 ‘大’ 或 email包含 “大”
q = Q()
q.connecter = "OR"
q.children.append(('name__contains', '大'))
q.children.append(('email__contains', '大'))
1. 批量操作[扩展]
- 反射
- __name__
- 一切皆对象
def multi_delete(self,request):
"""
批量删除的action
:param request:
:return:
"""
pk_list = request.POST.getlist('pk')
self.model_class.objects.filter(pk__in=pk_list).delete()
# return HttpResponse('删除成功') multi_delete.text = "批量删除"
2. 搜索[扩展]
# - Q
# - __contains
3. 保留原搜索条件
- QueryDict,request.GET/request.POST
- urlencode()
- _mutable = True
- 深拷贝
- urllib.parse.urlencode
4. 分页
#- 分页组件
#- 保留原条件
5. 拆分
#- ChangeList类封装
#- inclusion_tag
#- 生成器
1. 三个类
#ChangeList,封装列表页面需要的所有数据。
#StarkConfig,生成URL和视图对应关系 + 默认配置
#AdminSite,用于保存 数据库类 和 处理该类的对象 的对应关系 + 路由分发
_registry = { }
2. 知识点
inclusion_tag
yield urlencode _meta.model_name
_meta.app_label 深浅拷贝 QueryDict对象默认不可改 _mutable=True 生成器 路由分发:
- include
- ([],None,None) 函数和方法的区别? Q的作用?构造复杂的查询条件 models.User.object.filter(name__contains='李')
models.User.object.filter(name__contains='李',email__contains='李') 构造 or
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) )
c3.children.append( ('age__lte',5) ) c3 = Q()
c3.connector = 'ADN' c3.add(c1,"ADN")
c3.add(c2,"ADN") (name=li or email = li) AND ( id>2 and age<=5) models.User.object.filter(con) 反射
list_display:
row.name
getattr(row,'name')
action:
pass 继承
class RoleConfig(StarkConfig):
pass self到底是谁? 反向生成URL
reverse('xxx')
reverse('namespace:xxx') 分页(保留原搜索条件) ModelForm组件 functools
- wraps,用于保留原函数的元信息(函数名/函数注释等信息)
- partial,偏函数为函数默认传参。
import functools def func(a1,a2):
print(a1+a2) new_func = functools.partial(func,8) new_func(7)
new_func(2)
new_func(8) 预留可扩展位置 request.GET
request.GET.get('x')
request.GET['x']
request.GET.getlist('xxx')
request.GET._mutable = True
request.GET.copy()
request.GET.urlencode() mark_safe xss攻击是什么? 单例模式 获取函数名
__name__ autodiscover_module 装饰器 order_by __str__
3. QueryDict对象
#params = request.GET.copy()
#params._mutable = True
#params['k1'] = 'v1'
#params.setlist('k2',[11,22])
1. 可迭代对象?
class Row(object):
def __init__(self,data):
self.data = data def __iter__(self):
yield "<div>"
yield '全部'
for item in self.data:
yield "<a href='/index/?p1=1.0'>%s</a>" %item
yield "</div>" data_list= [
Row(['1.0以下','1.1-1.6']),
Row(['汽油','柴油','混合动力','电动']),
] for row in data_list:
for field in row:
print(field)
2.封装
list_filter = [
'董方方',
'黄晓雪',
'李贝贝', ] # ############################ 老封装思想 ############################ list_filter = [
{'text':'董方方','gender':'男','color':'xx'}, # 字典对象做封装
{'text':'黄晓雪','gender':'男','color':'xx'},
{'text':'李贝贝','gender':'男','color':'xx'},
] for item in list_filter:
print(item['text'] + item['gender']) # ############################ 老封装思想 ############################
class Option(object):
def __init__(self,text,gender,color):
self.text = text
self.gender = gender
self.color = color def get_t_g(self):
return self.text +self.gender list_filter = [
Option(text='董方方',gender='男',color = 'xx'), # 字典对象做封装
Option(text='黄晓雪',gender='男',color = 'xx'), # 字典对象做封装
Option(text='李贝贝',gender='男',color = 'xx'), # 字典对象做封装
] for item in list_filter:
print(item.get_t_g())
3. 获取FK/M2M/O2O对应的表中所有的数据
class UserInfo(models.Model): title = models.CharField(verbose_name='标题',max_length=32) def __str__(self):
return self.title class Depart(models.Model): name = models.CharField(verbose_name='部门名称',max_length=32)
tel = models.CharField(verbose_name='联系电话',max_length=32)
user = models.ForeignKey(verbose_name='负责人',to='UserInfo') def __str__(self):
return self.name def get_fk_queryset(request):
from app01 import models fk_obj = models.Depart._meta.get_field("user")
user_info_queryset = fk_obj.rel.model.objects.all()
print(user_info_queryset) return HttpResponse('...')
4. 组合搜索的功能
1. 字段配置
list_filter=['name','tel']
内部:
_field = self.config.model_class._meta.get_field('name')
if isinstance(_field, ForeignKey) or isinstance(_field, ManyToManyField):
_field.rel.model.objects.all()
else:
model_class.objects.all()
2. list_filter=[Option(),Option()]
内部:
字段
自定义条件 3. list_filter=[Option(),Option()]
内部:
Row对象 (可迭代对象)
yield 低级 4. list_filter=[Option(),Option()]
内部:
处理单选 5. list_filter=[Option(),Option()]
内部:
处理多选 6. 数据搜索 7. 组合搜索应用:
使用情况:
- FK
- Choice
- M2M
Option参数:
Option(field=数据库字段名,is_choice=是否是choice,text_func=显示文本的函数,value_func=URL中对应值的函数,condition=筛选条件,is_multi=是否支持多选), 示例:
list_filter = [
# DistinctNameOption('name',condition={'id__gt':9},value_func=lambda x:x[0],text_func=lambda x:x[0],),
Option('level',is_choice=True,text_func=lambda x:x[1]),
Option('user',text_func=lambda x:x.title,is_multi=True),
# Option('tel',text_func=lambda x:x.tel),
Option('proj',is_multi=True)
] # 配置项多
1. 闭包
def f1(a1,a2):
def inner():
ret = a1 + a3
return ret
return inner n1 = f1('寒舍','滤清瑶') # 内存 a1=寒舍,a2=滤清瑶
n2 = f1('国舅','小鲜肉') # 内存 a1=国舅,a2=小鲜肉
n3 = f1('渣渣辉','万鹏程') # 内存 a1=渣渣辉,a2=万鹏程 n1() # 帮助开发者维护一个“私密”空间,用于为以后执行提供数据。
2. Form和ModelForm的区别?
Form -> formset
ModelForm -> modelformset
3. 反射
import importlib
from django.utils.module_loading import import_string # 自定义
"""
path = "x1.xx.Foo"
module_path,class_name = path.rsplit('.',maxsplit=1) # 根据字符串的形式导入模块
m = importlib.import_module(module_path)
# Foo类
cls = getattr(m,class_name) print(cls)
""" # 基于django内置模块
"""
v = import_string("x1.xx.Foo")
print(v)
""" 开放封闭原则; 每次操作都要去修改源码: def email(arg):
pass def msg(arg):
pass def wechat(arg):
pass def dingding(arg):
pass def execute():
user_list = ['韩射','吕轻咬'] email('xx')
# msg('xx')
wechat('xx')
dingding('xx') 丁丁示例 注意:扩展
1. 相关知识点
#- 闭包+反射 #- bug
2. 客户管理
a. 公户客户/私户客户/所有客户 管理已完成 - 所有客户进行操作:销售主管 CustomerConfig - 公户客户进行操作:/推广/渠道/销售 PublicCustomerConfig - 私户客户进行操作:销售 PrivateCustomerConfig b. 公户和私户之间的操作: - 申请 - 移除 c. 跟进记录 - 所有跟进记录操作 - 私户跟进记录 d. 缴费 + 分班 - 缴费记录 - 财务审核 - 审核通过后分班(在student表中添加一条数据)
3. 教学管理
a. 直接操作学生表,伪造信息。 b. 上课记录 - 创建上课记录 - 初始化学生的学习记录 - 查看当天的学习记录 - 点名和作业信息的录入
第一部分:权限管理
第二部分:stark组件
第三部分:crm业务
1. crm系统主要用于做什么?
#客户关系管理。
2. 主要给谁用?
- 销售
- 客户分类,销售底薪+业绩
- 公户:申请(锁)
- 行锁:innodb -> 行锁+表锁+事务
- 表锁:Mysiam -> 表锁
- 私户:150人+自己客户
- 全户
- 客户跟进
- 缴费申请
- 推广
- 在公户中录入有效数据
- 渠道
- 在公户中录入有效数据
- 教学,老师
- 上课
- 作业
- 成绩
- 教质
- 考勤
- 问卷
- 学生
- 交作业
- 查成绩
- 查看个人信息
- 问卷
3. 技术点
- Form的作用?
- 对用户提交的一组表单数据进行校验。
- ModelForm的作用?
- 对用户提交的一组表单数据进行校验。
- 快速实现增加、修改
- FormSet的作用?
- 对用户提交的多组表单数据进行校验。
- ModelFormSet的作用?
- 对用户提交的多组表单数据进行校验。
- 快速实现增加、修改
CRM结束:
1. 课程100% = 3年 2. 学习阶段 初级阶段:增删改查 + Linux 阶段升级:做项目增加熟练度 + 开发组件 + Linux 阶段升级:看源码(Flask+Django) + Linux 阶段升级:架构(Linux硬件+代码(设计模式+领域驱动模型)) + Linux 合伙人搞创业 3. 如何让简历漂亮
a. 项目+技术点 b. 热点 c. 自学能力 源码 4. 设计+讲话能力 建议:
1. 上午+下午搞定全天知识点;晚上stark开始+新项目;
2. 时间:
- 内容回顾
- 周一~周四:上一天。
- 周五:全周 - 10:00~10:30 晚上:相互提问
3. 时间控制小时
statrc部分的更多相关文章
随机推荐
- Hello_Git!!!(Git的安装)
Install_Git&Say Hello! Mac与Linux平台 ||最近的Mac平台中都预装了Git,而各个版本的Linux中也都以软件包(Package)的形式提供给了用户,详细请参 ...
- vue+vuex+axios实现登录、注册页权限拦截
1.修改config文件夹里的dev.env.js里的BASE_API,把地址改成请求后端的公共部分 1 BASE_API: '"http://192.168.xx.xx"', 2 ...
- Oracle常见错误:ORA-06550、ORA-00911、ORA-02085
ORA-06550:检查标点符号,如果是在写存储过程时候,切记每行每条语句都应该以“;”结束 ORA-00911: invalid character 包含中文报错 ORA-02085:数据库连接 X ...
- 网易云和QQ音乐api
最近有点闲,听歌的时候遇见好听的想下载却遇到尴尬的事,版权!唉,知道我干什么了吧 网易云音乐 获取排行榜中的歌曲列表 https://music.163.com/discover/toplist?id ...
- oo 第一次博客作业
oo 第一次博客作业 早在大一就听说了oo的各种传奇故事,大二下学期终于也开始了我的oo之旅. 基于度量来分析自己的程序结构 第一次作业 类图分析 耦合度分析 可以看出在第一次作业中,我的耦合度非常高 ...
- 5.1HTML+CSS制作一颗流星
效果地址:https://codepen.io/flyingliao/pen/QPKQjB?editors=1100 效果图: HTML code: <div class="sky&q ...
- JS sort() 方法
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序.要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较. array.s ...
- idea的maven搭建
IntelliJ IDEA中创建Web聚合项目(Maven多模块项目) 在file-setting-maven中可以配置自己下载的maven,在自己下载maven目录的config下的setting. ...
- 主成分分析、实例及R语言原理实现
欢迎批评指正! 主成分分析(principal component analysis,PCA) 一.几何的角度理解PCA -- 举例:将原来的三维空间投影到方差最大且线性无关的两个方向(二维空间). ...
- 微信小程序商城开源项目,Weixin-App-Shop 1.0 版本正式发布!!!
微信小程序商城开源项目,Weixin-App-Shop 1.0 版本正式发布 Weixin-App-Shop 是捷微团队开发的微信小程序商城开源项目,涵盖了微信商城的全部功能,能够快速发布简单易用的小 ...