CRM stark组件

  1. 开启新项目:CRM
  2. 再创建一个应用app02(python manage.py startapp app02 或者是工具栏:run...task:执行startapp app02)
  3. settings.py:INSTALLED_APPS配置:
  • 'app01.apps.App01Config',
  • 'app02.apps.App02Config',
  1. 看apps.py是否有自动生成对应的

    class App01Config(AppConfig):

    name = 'app01'

  2. 2个应用的models.py:写入对应的表结构

     - 表结构后面要加:
    
      def __str__(self):
    return self.表名的title/name/...字段 - 并执行:
    - >>>makemigrations
    - >>>migrate
  3. 注册:admin就是Django封装好的一个app而已:

    • admin.py(app01)
    • from .models import 表名
    • admin.site.register(表名)
    • admin.py(app02)
    • from .models import 表名
    • admin.site.register(表名)
  4. 启动应用,访问:127...../admin 要用户名和密码

  5. createsuperuser

  6. 重启项目再次访问

    • 查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组件的更多相关文章

  1. ExtJS 4.2 评分组件

    上一文章是扩展ExtJS自带的Date组件.在这里将创建一个评分组件. 目录 1. 介绍 2. 示例 3. 资源下载 1. 介绍 代码参考的是 Sencha Touch 2上的一个RatingStar ...

  2. react组件的生命周期

    写在前面: 阅读了多遍文章之后,自己总结了一个.一遍加强记忆,和日后回顾. 一.实例化(初始化) var Button = React.createClass({ getInitialState: f ...

  3. react-router 组件式配置与对象式配置小区别

    1. react-router 对象式配置 和 组件式配置    组件式配置(Redirect) ----对应---- 对象式配置(onEnter钩子) IndexRedirect -----对应-- ...

  4. Angular2入门系列教程3-多个组件,主从关系

    上一篇 Angular2项目初体验-编写自己的第一个组件 好了,前面简单介绍了Angular2的基本开发,并且写了一个非常简单的组件,这篇文章我们将要学会编写多个组件并且有主从关系 现在,假设我们要做 ...

  5. Angular2入门系列教程2-项目初体验-编写自己的第一个组件

    上一篇 使用Angular-cli搭建Angular2开发环境 Angular2采用组件的编写模式,或者说,Angular2必须使用组件编写,没有组件,你甚至不能将Angular2项目启动起来 紧接着 ...

  6. .NET Core 首例 Office 开源跨平台组件(NPOI Core)

    前言 最近项目中,需要使用到 Excel 导出,找了一圈发现没有适用于 .NET Core的,不依赖Office和操作系统限制的 Office 组件,于是萌生了把 NPOI 适配并移植到 .NET C ...

  7. .NetCore中的日志(1)日志组件解析

    .NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...

  8. BootStrap_02之全局样式及组件

    1.BootStrap指定的四种屏幕尺寸: ①超大PC屏幕--lg(large):w>=1200px: ②中等PC屏幕--md(medium):1200px>w>=992px: ③P ...

  9. ExtJS 4.2 组件介绍

    目录 1. 介绍 1.1 说明 1.2 组件分类 1.3 组件名称 1.4 组件结构 2. 组件的创建方式 2.1 Ext.create()创建 2.2 xtype创建 1. 介绍 1.1 说明 Ex ...

随机推荐

  1. mongodb数据库备份恢复-windows系统

    备份语法: mongodump命令脚本语法如下: >mongodump -h dbhost -d dbname -o dbdirectory -h: MongDB所在服务器地址,例如:127.0 ...

  2. Grunt 使用(二)uglify插件压缩javascript代码

    本文在配置grunt基本环境的基础下,讲解如何使用grunt-contrib-uglify进行javascript压缩 本文只介绍了grunt-contrib-uglify插件的一种压缩方式适用于大部 ...

  3. VMware安装VMware tool后mount /dev/cdrom /mnt成功挂载含rpm包的镜像

    安装虚拟机后如果不安装vmware tool使用mount /dev/cdrom /mnt可以成功挂在含rpm包的镜像,但是安装VMware tool后挂在后/mnt中是错误的内容.查了半天后无果,自 ...

  4. 来自Google资深工程师的API设计最佳实践

    来自Google资深工程师Joshua Bloch的分享:API设计最佳实践 为什么API设计如此重要?API是一个公司最重要的资产. 为什么API的设计对程序员如此重要? API一旦发布,出于兼容性 ...

  5. mybatis查询缓存

    一级缓存针对每个sqlSession进行缓存,sqlSession销毁,一级缓存就不存在. ,使用Map存储了sql执行查询结果集(java对象) 二级缓存针对每个map的namespace进行缓存. ...

  6. win7 xampp php7 yii2 配置sqlserver

    第一步: https://www.microsoft.com/en-us/download/details.aspx?id=20098   下载  如下图   php7 版本 放到 xampp\php ...

  7. flex布局兼容性写法

    CSS样式 flex:定义布局为盒模型 flex-v:盒模型垂直布局 flex-1:子元素占据剩余的空间 flex-align-center:子元素垂直居中 flex-pack-center:子元素水 ...

  8. VC++读写*.ini配置文件

    ini文件(即Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息.ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Ke ...

  9. 关于iframe里的子页面如何调取父级页面里的事件(子调父)

    在子页面里面的事件里写 self.parent.window.父级函数名('参数名'); 父级里面直接写函数. js中的parent.top.self的含义. js中经常看到window.parent ...

  10. 如何将编写好的CS文件做成exe可执行文件

    编译好的控制台CS文件: cs文件单独拿出来放到F盘目录中 打开命令提示CMD: 执行下面语句即可在F盘目录中看到生成的exe文件,windows系统下双击就可运行: C:\Windows\Micro ...