1. Django项目启动 自动加载文件 制作启动文件

    1. 注册strak 在apps.py 类里面增加如下 

        def ready(self):
from django.utils.module_loading import autodiscover_modules
autodiscover_modules("stark") 2. 在已经注册的app中创建stark.py文件 加载 2. 在stark中模仿AdminSite ModelAdmin类写代码 注册自己的类 class StarkConfig(object): def __init__(self,model_class,site):
self.model_class = model_class
self.site = site class StarkSite(object): def __init__(self):
self._registey = {} def register(self,model_class,stark_config_class=None):
if not stark_config_class:
stark_config_class = StarkConfig self._registey[model_class] = stark_config_class(model_class,self) site = StarkSite() 3. 将注册的类自动生成url - urls.py
from stark.service import v1 urlpatterns = [
url(r'^stark/', v1.site.urls),
] - 为每个类生成4个url v1.py class StarkConfig(object): def __init__(self,model_class,site):
self.model_class = model_class
self.site = site def get_urls(self):
app_model_name = (self.model_class._meta.app_label,self.model_class._meta.model_name,)
url_patterns = [
url(r'^$',self.changelist_view,name="%s_%s_changlist" %app_model_name),
url(r'^add/$',self.add_view,name="%s_%s_add" %app_model_name),
url(r'^(\d+)/delete/$',self.delete_view,name="%s_%s_delete" %app_model_name),
url(r'^(\d+)/change/$',self.change_view,name="%s_%s_chang" %app_model_name),
]
return url_patterns @property
def urls(self):
return self.get_urls() def changelist_view(self,request,*args,**kwargs):
return HttpResponse('列表') def add_view(self,request,*args,**kwargs):
return HttpResponse('添加') def delete_view(self,request,nid,*args,**kwargs):
return HttpResponse('删除') def change_view(self,request,nid,*args,**kwargs):
return HttpResponse('修改') class StarkSite(object): def __init__(self):
self._registey = {} def register(self,model_class,stark_config_class=None):
if not stark_config_class:
stark_config_class = StarkConfig self._registey[model_class] = stark_config_class(model_class,self) def get_urls(self):
url_pattern = [] for model_class,stark_config_obj in self._registry.items(): app_name = model_class._meta.app_label
model_name = model_class._meta.model_name curd_url = url(r'^%s/%s/' %(app_name,model_name,) , (stark_config_obj.urls,None,None))
url_pattern.append(curd_url) return url_pattern @property
def urls(self):
return (self.get_urls(),None,'stark') site = StarkSite() 4. 列表页面展示 - v1.py
def changelist_view(self,request,*args,**kwargs):
# 处理表头 head_list = []
for field_name in self.list_display:
if isinstance(field_name,str):
# 根据类和字段名称,获取字段对象的verbose_name
verbose_name = self.model_class._meta.get_field(field_name).verbose_name
else:
verbose_name = field_name(self,is_header=True)
head_list.append(verbose_name) # 处理表中的数据
# [ UserInfoObj,UserInfoObj,UserInfoObj,UserInfoObj,]
# [ UserInfo(id=1,name='alex',age=18),UserInfo(id=2,name='alex2',age=181),]
data_list = self.model_class.objects.all()
new_data_list = []
for row in data_list:
# row是 UserInfo(id=2,name='alex2',age=181)
# row.id,row.name,row.age
temp = []
for field_name in self.list_display:
if isinstance(field_name,str):
val = getattr(row,field_name) # # 2 alex2
else:
val = field_name(self,row)
temp.append(val)
new_data_list.append(temp) return render(request,'stark/changelist.html',{'data_list':new_data_list,'head_list':head_list}) - shark.py
class UserInfoConfig(v1.StarkConfig): def checkbox(self,obj=None,is_header=False):
if is_header:
return '选择'
return mark_safe('<input type="checkbox" name="pk" value="%s" />' %(obj.id,))
def edit(self,obj=None,is_header=False):
if is_header:
return '编辑'
return mark_safe('<a href="/edit/%s">编辑</a>' %(obj.id,)) list_display = [checkbox,'id','name',edit] 4. 显示增加按钮 - 先判断是否显示,再通过反向解析生成增加链接
- 后端
# 是否显示增加按钮
show_add_btn = True
def get_show_btn(self):
return self.show_add_btn return render(request, 'stark/changelist.html', {'data_list': new_data_list, 'head_list': head_list,"add_url":self.get_add_url(),"show_add_btn":self.get_show_btn()}) - 前端
{% if show_add_btn %}
<a class="btn btn-primary" href="{{ add_url }}">增加</a>
{% endif %} 5. 增加内容页面 1. 通过ModelForm创建公共类 显示和提交 - 后端 def add_view(self, request, *args, **kwargs): class AddTable(ModelForm):
class Meta:
model = self.model_class
fields = "__all__" if request.method == "GET":
form = AddTable()
return render(request,"stark/add_view.html",{"form":form})
else:
form = AddTable(request.POST)
if form.is_valid():
form.save()
return redirect(self.get_list_url())
else:
return render(request, "stark/add_view.html", {"form": form}) - 前端
<form method="post" novalidate>
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="提交">
</form> 2. 升级 在子类自定义ModelForm类 子类之后可以自定义类 - v1.py
model_form_class = None
def get_model_form_class(self):
if self.model_form_class:
return self.model_form_class
else:
#方式一:
# class AddTable(ModelForm):
# class Meta:
# model = self.model_class
# fields = "__all__"
# return AddTable
#方式二:
meta = type("Meta",(object,),{"model":self.model_class,"fields":"__all__"})
AddTable = type("AddTable",(ModelForm,),{"Meta":meta})
return AddTable def add_view(self, request, *args, **kwargs):
model_form_class = self.get_model_form_class()
if request.method == "GET":
form = model_form_class()
return render(request,"stark/add_view.html",{"form":form})
else:
form = model_form_class(request.POST)
if form.is_valid():
form.save()
return redirect(self.get_list_url())
else:
return render(request, "stark/add_view.html", {"form": form})
- stark.py class UserInfoModelForm(ModelForm):
class Meta:
model = models.UserInfo
fields = ["name","password"]
error_messages = {
"name":{
'required':'用户名不能为空'
}
}
class UserInfoConfig(v1.StarkConfig):
model_form_class = UserInfoModelForm 6. 修改 和 删除
def change_view(self, request, nid, *args, **kwargs): obj = self.model_class.objects.filter(pk=nid).first()
if not obj:
return redirect(self.get_list_url())
model_form_class = self.get_model_form_class()
if request.method == "GET":
form = model_form_class(instance=obj)
return render(request,"stark/change_view.html",{"form":form})
else:
form = model_form_class(instance=obj,data=request.POST)
if form.is_valid:
form.save()
return redirect(self.get_list_url())
return render(request,"stark/change_view.html",{"form":form}) def delete_view(self, request, nid, *args, **kwargs):
self.model_class.objects.filter(pk=nid).delete()
return redirect(self.get_list_url())

  

CRM——插件流程回顾的更多相关文章

  1. 【Java EE 学习 54】【OA项目第一天】【SSH事务管理不能回滚问题解决】【struts2流程回顾】

    一.SSH整合之后事务问题和总结 1.引入问题:DAO层测试 假设将User对象设置为懒加载模式,在dao层使用load方法. 注意,注释不要放开. 使用如下的代码块进行测试: 会报错:no sess ...

  2. 【Vue】---编写Vue插件流程---【巷子】

    一.在Vue中编写插件流程 1.创建组件 components/message.vue <template> <div class="message" v-if= ...

  3. CRM 插件导出

    CRM插件注册一般有三种方式, 1  database 2 disk 3  GAC 如果注册到disk 应该在会在 C:\Program Files\Microsoft Dynamics CRM\Se ...

  4. CRM 插件奇怪的报错

    CRM插件,数据库方式注册.报错 找不到方法:“Void Microsoft.Xrm.Sdk.Entity..ctor(System.String, System.Guid)”. 这个错误让人摸不着头 ...

  5. Dynamic CRM插件中记录日志-Nlog记录到文本

    Dynamic CRM插件中记录日志的方式有多种 通常情况下分为ITracingService记录.单独日志表插入记录.文本记录三种. 之前整理过ITracingService记录的方式,但这种记录有 ...

  6. Dynamics CRM 插件注册时报Assembly must be registered in isolation的解决方法

    在插件注册的时候经常会遇到"Assembly must be registered in isolation"的问题导致无法注册,之前经常会被同事或者朋友问到这个问题,遇到这个问题 ...

  7. Dynamics CRM 插件Plugin中获取和更新时间字段值的准确转换

    前面两篇介绍了后台代码通过组织服务获取更新时间字段.窗体javascript通过Odata获取更新时间字段,最后篇来实验下在插件中的获取和更新时间字段是否需要时制的转化,为何说是最后篇呢,因为在CRM ...

  8. Dynamic CRM工作流流程实战

    前言在研究了MSCRM中插件的使用之后,不可避免需要研究工作流,工作流在各种营销系统中都举足轻重. 关于工作流功能:使用工作流可在后台实现业务流程自动化.类别:分为后台工作流(异步)和实时工作流(同步 ...

  9. Dynamic CRM插件调试与单元测试

    背景 使用Dynamic CRM平台开发完业务插件后,不可避免的就是进行插件调试,测试插件是否正常运行,网上关于Dynamic CRM的资料比较少,但对于调试的博客还是挺多的,足可见插件调试对于Dyn ...

随机推荐

  1. Java与.NET机制比较分析

    一.概述 不管是什么语言开发的web应用程序,都是在解决一个问题,那就是用户输入url怎么把对应的页面响应出来,如何通过url映射到响应的类,由于自己做asp.net的时间也不短了,还算是对asp.n ...

  2. Tuning 14 Using Oracle Data Storage Structures Efficiently

    90% 是Heap table Cluster 集群表, index-organized table: 就是把索引和表 和二为一了. partitioned table:表非常大, 逻辑上是一个大表, ...

  3. Tuning 04 Sizing the Buffer Cache

    Buffer Cache 特性 The buffer cache holds copies of the data blocks from the data files. Because the bu ...

  4. 对sql初始化的值的处理

    要把数据库的值置为数据库初始化时候的值(带隐式的null值)的sql语句. UPDATE member_base_info SET orderType =NULL,getaimAddress=NULL ...

  5. .NET平台下 极光推送

    正好看到别人发了个极光的推送例子,想来前面也刚做过这个,就把我的push类共享下 public class JPush { /// <summary> /// push信息到手机应用上 J ...

  6. web中用纯CSS实现筛选菜单

    web中用纯CSS实现筛选菜单 本文我们来用纯css实现像淘宝宝贝筛选菜单那样的效果,例子虽然没有淘宝那样强大,不过原理差不多,如果花点心思也可以实现和淘宝一样的. 内容过滤是一个在Web上常见的一个 ...

  7. String, StringBuffer StringBuilder的区别。

    解答:String的长度是不可变的: StringBuffer的长度是可变的,如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使 ...

  8. IOS 分节表视图

    分节表视图 简单的表视图仅仅有一个节,它实际上是分节表视图的一个特例.一个表能够有多个节,节也有头有脚,分节是加入索引和分组的前提. 索引的正确使用原则如所看到的: 1.索引标题不能与显示的标题全然一 ...

  9. 【Raspberry pi】python ide-spyder

    sudo apt-get install spyder 简单 明了

  10. 在系统重装后为什么ChemDraw用不了

    作为一款非常受欢迎的化学绘图软件ChemDraw需要在满足运行条件的电脑上运行,但是一些用户发现自己在给自己的电脑重装系统之后,ChemDraw运行不了呢.导致ChemDraw用不了的原因比较多样,不 ...