CRM2Stark组件
CRM stark组件
- 开启新项目:CRM
- 再创建一个应用app02(python manage.py startapp app02 或者是工具栏:run...task:执行startapp app02)
- settings.py:INSTALLED_APPS配置:
- 'app01.apps.App01Config',
- 'app02.apps.App02Config',
看apps.py是否有自动生成对应的
class App01Config(AppConfig):
name = 'app01'2个应用的models.py:写入对应的表结构
- 表结构后面要加: def __str__(self):
return self.表名的title/name/...字段 - 并执行:
- >>>makemigrations
- >>>migrate
注册:admin就是Django封装好的一个app而已:
- admin.py(app01)
- from .models import 表名
- admin.site.register(表名)
- admin.py(app02)
- from .models import 表名
- admin.site.register(表名)
启动应用,访问:127...../admin 要用户名和密码
createsuperuser
重启项目再次访问
- 查url:admin/app0.../表名
- 增url:admin/app0.../add
- 改url:admin/app0.../change
- 删url:admin/app0.../delete
以上就一行代码:增删改查所有都实现了,额外增加业务,只需要设计表结构就行了,我们的目标是自定义stark组件,学习源码:(既然是通过register()来实现的,我们先看register)
1启动每个app下的admin.py
2注册
def register(self,model_or_iterable,admin_class=None,**options):
admin_class = admin_class or ModelAdmin
[ModelAdim]:ModelAdim配置类
1, Django默认显示字段##
admin.py
class 表名Config(admin.ModelAdmin):--->继承
pass--->用了pass就代表默认用系统的
admin.site.register(表名,表名Config)--->默认用系统的
注意:不能重复register(表名)注册
2,自定义要显示的字段
admin.py
class 表名Config(admin.ModelAdmin):>>>>>继承ModelAdmin
list_display=['name','city','email']---->控制页面(字段)显示
admin.site.register(表名, 表名Config)>>>>>生成新的表格结构
3,显示关联表的字段(有多个,特殊)
admin.py
class BookConfig(admin.ModelAdmin):
def show_authors(self,obj):
return ",".join([obj.name for obj in obj.authors.all()])
list_display = ['title','pub_date','price',"show_authors"]
admin.site.register(Book,BookConfig)
4,自定义接口
class BookConfig(admin.ModelAdmin):
def del_action(self,obj):
return '<a href=''>删除</a>'
list_display = ["title","del_action"]
admin.site.register(Book,BookConfig)
Django的安全措施:a标签全部会显示,解决方案:
from django.utils.safestring import mark_safe
class BookConfig(admin.ModelAdmin):
def del_action(self,obj):
return mark_safe('<a href=''>删除</a>')
list_display = ["title","del_action"]
admin.site.register(Book,BookConfig)
admin定制
方式一:
class PublishConfig(admin.ModelAdmin):
list_display = ('name', 'city', 'email')
admin.site.register(Publish,PublishConfig) # 第一个参数可以是列表
方式二:
@admin.register(Publish) # 第一个参数可以是列表
class PublishConfig(admin.ModelAdmin):
list_display = ('name', 'email', 'city')
可定制功能
1. list_display=['','']按XX字段显示(1.0是放函数名.2.0是放函数名的字符串)
@admin.register(Book)
class BookConfig(admin.ModelAdmin):
list_display = ('title', 'price', 'authors')
def xxxxx(self, obj):
return "xxxxx"
2. list_display_links,列表时,定制列可以点击跳转。
@admin.register(Book)
class BookConfig(admin.ModelAdmin):
list_display = ('title', 'price', 'authors')
list_display_links = ('title',)
3. list_filter=['xx']过滤某个字段
- 一般不这么用,'10万本书'
- 一般按1对多的字段过滤list_filter=['publish']
- 多对多:list_filter==['publish','authors']
4. list_select_related,列表时,连表查询是否自动select_related
5. list_editable,列表时,可以编辑的列 直接可在该字段下面所有值进行修改编辑
@admin.register(Book)
class BookConfig(admin.ModelAdmin):
list_display = ('title', 'price', 'authors')
list_editable = ('title',)
6. search_fields,列表时,模糊搜索的功能
@admin.register(Book)
class BookConfig(admin.ModelAdmin):
search_fields = ('title', 'price')
7. date_hierarchy,列表时,对Date和DateTime类型进行搜索
@admin.register(Book)
class UserAdmin(admin.ModelAdmin):
date_hierarchy = 'pub_date'
8. action,列表时,定制action中的操作 short_description命名
class BookConfig(admin.ModelAdmin):
list_display = ["title", 'price', 'pub_date', "publish"]
def patch_init(self, request, queryset):
queryset.update(price=100)
patch_init.short_description = "批量初始化" # 命名
actions = [patch_init, ]
admin.site.register(Book, BookConfig)
9. 定制HTML页面
class BookConfig(admin.ModelAdmin):
list_display = ["title", 'price', 'pub_date', "publish"]
change_list_template = "mylist.html"
admin.site.register(Book,BookConfig)
10. 排序(降序-)
class BookConfig(admin.ModelAdmin):
list_display = ["title", 'price', 'pub_date', "publish"]
ordering = ["-price"]
admin.site.register(Book,BookConfig)
11. inlines,详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除
12. 显示多对多:author和外键publish字段
class BookConfig(admin.ModelAdmin):
def show_authors(self,obj):
return ",".join([obj.name for obj in obj.authors.all()])
list_display = ['title','pub_date','price','publish',"show_authors"]
ordering = ['-price']
admin.site.register(Book,BookConfig)
路由一级分发
urls.py
path('index/',([
path('test01/',views.test01),
path('test02/',views.test02)],
None,
None)),---->None必须写
views.py
def test01(request):
return HttpResponse('test01')
def test02(request):
return HttpResponse('test02')
浏览器:...index/test01
路由二级分发
![](https: // img2018.cnblogs.com / blog / 1523703 / 201901 / 1523703 - 20190118145157917 - 1003858455.png)
二级分发应用
urls.py
from django.contrib import admin
from django.urls import path,re_path
from django.conf.urls import url
from django.shortcuts import HttpResponse
def add_view(request):
return HttpResponse("add_view...")
def list_view(request):
return HttpResponse("list_view...")
def change_view(request,id):
return HttpResponse("change_view...")
def delete_view(request,id):
return HttpResponse("delete_view...")
def get_urls2():
temp=[
path('', list_view),
path('add/', add_view),
re_path('(\d+)/change/', change_view),
re_path('(\d+)/delete/', delete_view),
]
return temp
def get_urls():
print("------>",admin.site._registry) # 键值对
#{Book:BookCongfigObj,Publish:PublishConfigObj,.....}
temp = []
for model,config_obj in admin.site._registry.items():
model_name=model._meta.model_name
app_label=model._meta.app_label
temp.append(
path('%s/%s/' % (app_label, model_name),
(get_urls2(),None,None)),
)
return temp
urlpatterns = [
path('yuan/',(get_urls(),None,None)),
]
CRM2Stark组件的更多相关文章
- ExtJS 4.2 评分组件
上一文章是扩展ExtJS自带的Date组件.在这里将创建一个评分组件. 目录 1. 介绍 2. 示例 3. 资源下载 1. 介绍 代码参考的是 Sencha Touch 2上的一个RatingStar ...
- react组件的生命周期
写在前面: 阅读了多遍文章之后,自己总结了一个.一遍加强记忆,和日后回顾. 一.实例化(初始化) var Button = React.createClass({ getInitialState: f ...
- react-router 组件式配置与对象式配置小区别
1. react-router 对象式配置 和 组件式配置 组件式配置(Redirect) ----对应---- 对象式配置(onEnter钩子) IndexRedirect -----对应-- ...
- Angular2入门系列教程3-多个组件,主从关系
上一篇 Angular2项目初体验-编写自己的第一个组件 好了,前面简单介绍了Angular2的基本开发,并且写了一个非常简单的组件,这篇文章我们将要学会编写多个组件并且有主从关系 现在,假设我们要做 ...
- Angular2入门系列教程2-项目初体验-编写自己的第一个组件
上一篇 使用Angular-cli搭建Angular2开发环境 Angular2采用组件的编写模式,或者说,Angular2必须使用组件编写,没有组件,你甚至不能将Angular2项目启动起来 紧接着 ...
- .NET Core 首例 Office 开源跨平台组件(NPOI Core)
前言 最近项目中,需要使用到 Excel 导出,找了一圈发现没有适用于 .NET Core的,不依赖Office和操作系统限制的 Office 组件,于是萌生了把 NPOI 适配并移植到 .NET C ...
- .NetCore中的日志(1)日志组件解析
.NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...
- BootStrap_02之全局样式及组件
1.BootStrap指定的四种屏幕尺寸: ①超大PC屏幕--lg(large):w>=1200px: ②中等PC屏幕--md(medium):1200px>w>=992px: ③P ...
- ExtJS 4.2 组件介绍
目录 1. 介绍 1.1 说明 1.2 组件分类 1.3 组件名称 1.4 组件结构 2. 组件的创建方式 2.1 Ext.create()创建 2.2 xtype创建 1. 介绍 1.1 说明 Ex ...
随机推荐
- Mysql学习---SQL语言的四大分类
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHE ...
- 二阶SQL注入理解与体会
一:SQL注入分类 SQL注入一般分为两类:一阶SQL注入(普通SQL注入),二阶SQL注入 二:二者进行比较 0x01:一阶SQL注入: 1:一阶SQL注入发生在一个HTTP请求和响应中,对系统的攻 ...
- awrsqrpt.sql简介
ORACLE_HOME/RDBMS/admin/awrsqrpt.sql 这个脚本可以很方便地取出某个sql在某两个快照间隔内,消耗cpu时间,执行次数,逻辑读,物理读,sql的执行计划以及sql的 ...
- Native广告月入万刀的全部细节!
一步一步跑Native原生广告: 第一步:跑native前期的准备工作 第二步:阅读大神的Native文档(100多页,英文,建议找一个支持在线翻译功能的app来阅读) 第三步:阅读我的几十条经验总结 ...
- SAP CRM系统订单模型的设计与实现
SAP成都研究院的一个部门领导让我给他的团队做一个SAP CRM One Order框架的培训,这是我准备的培训内容. 在Jerry之前的文章 基于SAP Kyma的订单编排增强介绍,我表达了自己对S ...
- mysql 查询大量数据报错
错误:Incorrect key file for table '/tmp/#sql_... 由于一次查询出大量数据,并且使用了临时表,导致产生此错误,主要是存放临时表文件的/tmp目录大小不足导致.
- web.xml的加载过程是context-param >> listener >> fileter >> servlet
web.xml的加载过程是context-param >> listener >> fileter >> servlet
- table中实现数据上移下移效果
html 由于vue+Element项目中的table,没有开放的上移下移的api,但是能对数据操作,故思路为数组中的一条数据,再重新添加一条数据,办法有点笨,但是好歹也是实现了,望有好的办法的,请留 ...
- mybatis框架的核心配置Mapper.xml
映射管理器resultMap:映射管理器,是Mybatis中最强大的工具,使用其可以进行实体类之间的关系,并管理结果和实体类间的映射关系 需要配置的属性:<resultMap id=" ...
- 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件
“/”应用程序中的服务器错误. 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“c552ea94-6fbb-11d5-a9c1-00104bb6fc1c”. 说明: 执行当前 Web ...