stark组件

stark组件是根据Django admin为原型写的一个组件,能够让我们告别增删改查.stark组件是可插拔试的组件,

移植性强,而且只用配置文件就能够得到想要的数据

一、stark组件路由分发

admin用这一条路由就实现了注册表单*4的url。

路由分发的原理:

知识一:admin之路由分发原理:
def text01(request):return  HttpResponse('text01')
def text02(request):return  HttpResponse('text02')
def text03(request):return  HttpResponse('text03')
urlpatterns = [path('chen/',([path('text01/',text01),path('text02/',text02),path('text03/',text03),],None,None))
]由一个路由分发出来三个 第一个none是namespace,第二个是项目名称一级:path('chen/',([path()path()path()],None,None))由一个路由分发出来三个,第一个路由又可以分发出来两个,二级路由.第一个none是namespace,第二个是项目名称二级:path('chen/',([path([path(),path(),],None,None))],None,None))

路由分发原理

单例模式:

***公共的数据***
一个类只允许实例一个对象
***为了数据统一****

怎么生成单例模式?

方式一:__new__

        __new__class Singleton(object):_instance = Nonedef __new__(cls, *args, **kwargs):# 第一次生成对象的时候走:if not cls._instance:cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) # 第二次走的时候直接走这里return cls._instance
class MyClass(Singleton):  a = 1#那么每次实例对象的时候都是指向 同一个内存地址.
#实例MyClass的时候都是 同一个对象

View Code

方式二:python模块

python模块是天然的单例模式:

1.不管模块哪里导入,只要是再次导入都是从.pyc导入,都是一个内存地址
    因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,
   就会直接加载 .pyc 文件,而不会再次执行模块代码。
2.我们只需把模块的对象实例化,每次调用的时候都调用这个对象,就可以获得一个单例对象了。

class StarkSite(object):"""注册model对应的配置类(MondelStark或用户自定制)"""def __init__(self):self._registry={}#self--->site单例对象def register(self,model,stark_class=None):if not stark_class:stark_class=MondelStarkself._registry[model] = stark_class(model,self)def get_urls(self):# self--->site单例对象temp=[]for model,stark_class_obj in self._registry.items():model_name=model._meta.model_nameapp_label =model._meta.app_labeltemp.append(path('%s/%s/'%(app_label,model_name),stark_class_obj.get_url_dispath))'''path('repository/book/'BookStark(book,).get_url_dispath)path('repository/author/'BookStark(author,).get_url_dispath)'''return temp@propertydef urls(self):return self.get_urls(),None,Nonesite=StarkSite()

单例

每次调用site就是单例对象

说完单例模式,再说回路由的分发:

stark.site就是一个单例,里面进行注册我们的models

为什么我们要用单例模式???

为了能够把model注册到同一个对象里面,我们就可以实现数据统一调度。

StarkSite形成单例类的代码:

#单例的类
class StarkSite(object):"""注册model对应的配置类(MondelStark或用户自定制)"""def __init__(self):self._registry={}#self--->site单例对象def register(self,model,stark_class=None):if not stark_class:stark_class=MondelStarkself._registry[model] = stark_class(model,self)def get_urls(self):# self--->site单例对象temp=[]for model,stark_class_obj in self._registry.items():model_name=model._meta.model_nameapp_label =model._meta.app_labeltemp.append(path('%s/%s/'%(app_label,model_name),stark_class_obj.get_url_dispath))'''path('repository/book/'BookStark(book,).get_url_dispath)path('repository/author/'BookStark(author,).get_url_dispath)'''return temp@propertydef urls(self):return self.get_urls(),None,None

View Code

在register()方法里面,我们在注册的前提

大前提!!!!!!!

***思考***

我们里在直接调用这个register方法?

那么里面注册了数据了吗?

答案是没有的,

***思路***

在每次开启项目的时候,能够自动执行某个py文件进行注册

from repository import models
from stark.server.stark import site
from stark.server.stark import MondelStark

引入

#我们需要在stark项目的app里:
from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modulesclass StarkConfig(AppConfig):name = 'stark'def ready(self):autodiscover_modules('stark',)#每次启动都会执行每个项目的stark.py文件,那么一开启项目就把model注册了.###########其他项目注册model##########
site.register(models.Book,BookStark)site.register(models.Author,AuthorStark)site.register(models.publish)

自动执行py文件

在其他项目stark.py我们可以自己进行配置类的书写

from stark.server.stark import MondelStarkclass BookStark(MondelStark):
pass

View Code

如何通过模型类获得字符串名称,和该模型所在的app名称:

我们需要构建的是一级分发:

第一个是model所属项目的名称/第二个是model类的类名

(path('%s/%s'%(app_label,model_name),))

 for model,class_obj in admin.site._registry.items():print(model._meta.model_name) #打印出该模型的名称print(model._meta.app_label)  #打印出该模型的app的名称

View Code

二级分发我们需要写在配置类里面:

为什么不能写在单例?

从图中可以看出,如果是单例对象的话,每个model类对应的视图函数都是一样的

我们想要的是每一个model类都需要4个视图函数,

所以我们只能把二级分发放在配置类里面,让每个配置类都生成四个相对应的视图函数

    def url_dispath(self):# self--->stark_class_obj--->每一个单独的配置类.temp = []model_name = self.model._meta.model_nameapp_label = self.model._meta.app_labeltemp.extend([path('add/', self.add_view,name="%s_%s_add"%(app_label,model_name)),re_path('^(\d+)/delete/', self.delete_view,name="%s_%s_delete"%(app_label,model_name)),re_path('^(\d+)/change/', self.change_view,name="%s_%s_change"%(app_label,model_name)),path('', self.show_list,name="%s_%s_list"%(app_label,model_name))])return temp#起别名,目的是为了反向查询的时候能够查到相对应的url

二级分发

构建表结构:

自定制表头:

配置类继承了MondelStark的配置类

class BookStark(MondelStark):list_display=['id','name','price']site.register(models.Book,BookStark)

构建表格

构建表头知识补充:

#如果客户自定制了配置list_display 那么实例化的时候就先在用户自定义的类里面找
#有则返回给后端......没有再去他的父类里面找list_display为空.

属性的反射

属性和方法都可以进行反射

    ###################
    反射:class B(object):def__init__(self,name):self.name=namechen=B('chenxuming')s='name'ret=getattr(chen,s)print(ret)  ---->'chenxuming'

属性的反射

如何将表头换成中文:

val = self.config.model._meta.get_field(field).verbose_name
header_list.append(val)

class Book(models.Model):name = models.CharField(max_length=64,verbose_name='书名')price= models.IntegerField()name=Book._meta.get_field('name')#name拿到的是title字段的对象print(name)print(type(name))#可以取里面的属性name.max_length  --->64name.verbose_name--->'书名'

View Code

#判断是否是函数的字段
if callable():

from django.utils.safestring import mark_safe
mark_safe(安全调用标签)

构建表格的代码

    def new_list_display(self):''''构建初始化列表的字段''   temp=[]temp.append(MondelStark.checkbox)temp.extend(self.list_display)temp.append(MondelStark.get_delete_msg)if not self.list_display_links:temp.append(MondelStark.get_edit_msg)return tempdef get_headers(self):# 构建表头:      self.new_list_display=[checkbox,'name','price',delete,edit]header_list = []for field in  self.config.new_list_display:if callable(field):val = field(self.config, header=True)header_list.append(val)else:if field == '__str__':val =  self.config.model_name.upper()header_list.append(val)else:val =  self.config.model._meta.get_field(field).verbose_nameheader_list.append(val)return header_listdef get_body(self):# 表数据的创建new_list = []for obj in self.data_list:item_list = []for item in  self.config.new_list_display:if callable(item):val = item(self.config, obj)else:val = getattr(obj, item)if item in  self.config.list_display_links:val = mark_safe('<a href="%s">%s</a>' % ( self.config.get_edit_url(obj), val))item_list.append(val)new_list.append(item_list)return new_list[[数据],[数据],[数据]]##########表头,部分表数据的函数#########def checkbox(self,obj=None,header=False):if header:return mark_safe('<input id="choice_all" type="checkbox">')return mark_safe('<input class="item" type="checkbox" name="selected_id" value="%s">'%obj.id)def get_edit_msg(self,obj=None,header=False):if header:return "操作"_url=self.get_edit_url(obj)return mark_safe('<a href="%s">编辑</a>' % _url)def get_delete_msg(self,obj=None,header=False):if header:return "操作"_url=self.get_delete_url(obj)return mark_safe('<a href="%s">删除</a>'%_url)

构建表格

增:

增和改都是基于ModelForm来实现的。

如果用户自定制

Stark_Model_Form=自定制modelform的类名

class BookStark(MondelStark):list_display=['id','name','price']Stark_Model_Form=ModelFormBooklist_display_links = ['name']class ModelFormBook(ModelForm):"""自定制ModelForm类"""class Meta:model=models.Bookfields='__all__'labels={'name':'书名','price':'价格','pub':'出版社','author':'作者',}def get_model_class(self):'''判断是否自定制了ModelForm'''if not self.Stark_Model_Form:from django.forms import ModelFormclass ModelDeMo(ModelForm):class Meta:model = self.modelfields = '__all__'return ModelDeMoelse:return self.Stark_Model_Formdef add_view(self,request):'''增加的视图函数'''# self--->stark_class_obj--->每一个单独的配置类.ModelDeMo=self.get_model_class()if request.method=='GET':form =ModelDeMo()return render(request, 'oprate/add.html', {'form':form})if request.method=='POST':form = ModelDeMo(request.POST)if form.is_valid():form.save()return redirect(self.get_list_url())else:return render(request,'oprate/add.html',{'form':form})###########前端#########
<form class="form-horizontal col-sm-7" method="post" novalidate>{% csrf_token %}{% for data in form  %}<label>{{ data.label }}</label>{{ data }}<div class="errors-form">{{ data.errors.0 }}</div>{% endfor %}<button type="submit" class="btn btn-success">提交</button>
</form>

add

改:

和增加差不多

    def change_view(self,request,nid):'''改 视图函数'''# self--->stark_class_obj--->每一个单独的配置类.ModelDeMo=self.get_model_class()change_obj=self.model.objects.filter(id=nid).first()if request.method=='GET':form=ModelDeMo(instance=change_obj)return render(request,'oprate/edit.html',{'form':form})if request.method=='POST':show_url = self.get_list_url()#instance=change_obj# form.save()#执行的是update操作form=ModelDeMo(data=request.POST,instance=change_obj)if form.is_valid():form.save()return redirect(show_url)else:return render(request, 'oprate/edit.html', {'form': form})###前端###<form class="form-horizontal col-sm-7" method="post" novalidate>{% csrf_token %}{% for data in form  %}<label>{{ data.label }}</label>{{ data }}<div class="errors-form">{{ data.errors.0 }}</div>{% endfor %}<button type="submit" class="btn btn-success">提交</button>
</form>

change

删:

删要注意的是需要跳转到一个页面,确保用户误点

    def delete_view(self,request,nid):# 删除视图函数# self--->stark_class_obj--->每一个单独的配置类.del_obj = self.model.objects.filter(id=nid).first()show_url = self.get_list_url()if request.method=='GET':return render(request,'oprate/delete.html',{'show_url':show_url})if request.method=='POST':if del_obj:del_obj.delete()return redirect(show_url)###前端######<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>删除页面</h1>
<form action="" method="post" novalidate>{% csrf_token %}<input type="submit" value="确认删除"><a href="{{ show_url }}">取消</a>
</form></body>
</html>

View Code

search

用户能够自己配置进行模糊查询

Q方法的补充

from django.db.models import QQ的两种玩法:第一种:
查询字段必须是字段Book.objects.filter(Q(title='yuan')|Q(price=123))第二种
查询字段可以是字符串:#实例化一个Q对象
search_connction=Q()
#或查询默认是and
search_connction.connector='or'for search_fiile in self.search_fiile   #self.search_fiile 用户自定制的['name','price']#append里面是一个元组#search_connction.children.append((search_fiile,'查询的内容'))search_connction.children.append((search_fiile+'__contains','查询的内容'))模糊查询data_list = self.model.objects.filter(search_list)

Q两种方法

stark实现search

需要自定制字段:

search_fields = ['name']

def get_search_connection(self,request):'''获取模糊查询的Q'''self.key_word=request.GET.get('q','')search_connction=Q()if self.key_word:search_connction.connector='or'for fields in self.search_fields:search_connction.children.append((fields+'__icontains',self.key_word))return search_connctionsearch_list=self.get_search_connection(request)data_list = self.model.objects.filter(search_list)##前端##
{% if showlist.config.search_fields %}<form action="" method="get" class="pull-right"><input type="text" name="q" value="{{ showlist.config.key_word }}"><button>查询</button></form>{% endif %}

View Code

转载于:https://www.cnblogs.com/chenxuming/p/9308049.html

Django之stark组件1相关推荐

  1. Django之stark组件

    现在让我说啥是stark组件,我也说不清楚.反正从今天讲的知识来看,今天完成的就是自己写一个模块,这个模块包含了admin后台管理工具的一些比较好用的功能,我们把它提炼出来,也就是相当于自己写一个ad ...

  2. Django基于admin的stark组件创建(一)

    首先创建一个名为stark_test的Django项目,创建2个app一个名为app01用来测试stark组件,一个就叫做stark,用来放stark组件 如图: 我们这里使用的是Django自带的数 ...

  3. Django——stark组件

    stark组件是仿照django的admin模块开发的一套组件,它的作用是在网页上对注册的数据表进行增删改查操作. 一.配置 1.创建stark应用,在settings.py中注册stark应用 st ...

  4. Stark 组件:快速开发神器 —— 锦上添花

    Stark 组件:快速开发神器 -- 锦上添花 一.分页 二.排序 三.搜索 1.关键字搜索 2.组合搜索 四.批量操作 经过前面几个篇章,我们的 Stark 组件已经能够批量生成 URL,快速实现增 ...

  5. Stark 组件:快速开发神器 —— 自动生成 URL

    说道 Stark 你是不是不会想到他--Tony Stark,超级英雄钢铁侠,这也是我的偶像. 不过我们今天要开发的 Stark 组件,倒是跟他的人工智能助手 JARVIS 有些类似,是帮助我们快速开 ...

  6. crm——stark组件核心原理

    关于stark组件的简要介绍: 启动后.路由加载前定制一段代码. a. 创建一个 stark  app 组件 b. 编写ready方法 1 from django.apps import AppCon ...

  7. 模拟admin组件自己开发stark组件之创建篇

    admin组件 admin组件为我们提供了针对django管理页面 我们先简短来看下django的admin组件的启动流程,注册流程,url匹配过程 启动注册 1. 扫描所有应用下的注册了应用中的ad ...

  8. python Stark 组件

    Django Admin 是对model中 对应的数据表进行增删改查的组件,对每个APP下面已注册的model表进行增删改查.而stark组件仿照Admin组件开发. Admin的常用配置:  Fil ...

  9. CRM项目之stark组件url的视图函数和列表页面基本展示2

    页面上展示数据表的表头 我们注册了UserInfo表之后,在视图函数change_list_view中执行data_list = self.model_class.objects.all()就可以拿到 ...

最新文章

  1. 即将到来的日子 ,你会寂寞吗?
  2. MySQL常见命令 [转]
  3. android 自定义dialog 定时关闭,Android编程实现自定义Dialog的大小自动控制方法示例...
  4. 百度蜘蛛动态网页ajax,百度SEO优化百度蜘蛛可读内容
  5. 升级openssh带来的问题
  6. nginx常用功能介绍
  7. php 文章搜索,登录 - 文章搜索 - phpStudy - phpStudy
  8. volatile关键字——保证并发编程中的可见性、有序性
  9. 应用系统集群解决方案
  10. 使用Hamcrest增强JUnit的测试能力
  11. hbase-client1.2.0新版api获取数据方式
  12. 英语(10)---脱口而出的英语
  13. 【转】探秘Java中的String、StringBuilder以及StringBuffer
  14. atitit.php 流行框架 前三甲为:Laravel、Phalcon、Symfony2 attilax 总结
  15. java applet 按钮_Java Applet语法简介
  16. VUE调用高德地图之热力图
  17. 杀戮尖塔 地图生成器参考
  18. 接口各项性能测试指标
  19. Python爬虫 之 破解 cookie 代理 验证码 实战
  20. 【SpringMVC】编程式事务控制,基于 XML 的声明式事务控制,基于注解的声明式事务控制

热门文章

  1. 数字2DPSK频带传输系统的设计(文内附完整代码)
  2. ZZULIOJ:1141: 进制转换
  3. Command “python setup.py egg_info“ failed with error code 1 in /tmp/pip-build-5z0k7aoz/pynacl/
  4. 2022年新一代最强开源UI自动化测试神器 ——Playwright(三)
  5. 陕西邮电职业技术学院计算机系怎么样,陕西邮电职业技术学院的办学实力怎么样?...
  6. 什么是3C认证?3C认证的介绍
  7. 夜雨数竞笔记-不定积分(1)-换元法-倒代换
  8. iOS中物理单位换算
  9. [转]JavaScript和html5 canvas生成圆形印章
  10. Scratch 与C语言实现数据结构静态链表的建立及操作