一、admin组件使用

Django 提供了基于 web 的管理工具。

Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它:

  1. # Application definition
  2.  
  3. INSTALLED_APPS = [
  4. 'django.contrib.admin',
  5. 'django.contrib.auth',
  6. 'django.contrib.contenttypes',
  7. 'django.contrib.sessions',
  8. 'django.contrib.messages',
  9. 'django.contrib.staticfiles',
  10. "app01"
  11. ]

django.contrib是一套庞大的功能集,它是Django基本代码的组成部分。

1、激活管理工具

通常我们在生成项目时会在 urls.py 中自动设置好

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3.  
  4. urlpatterns = [
  5. url(r'^admin/', admin.site.urls),
  6.  
  7. ]

2、使用管理工具

启动开发服务器,然后在浏览器中访问 http://127.0.0.1:8000/admin/,得到登陆界面,你可以通过命令 python manage.py createsuperuser 来创建超级用户。

为了让 admin 界面管理某个数据模型,我们需要先注册该数据模型(models.py)到 admin

admin.py

  1. from django.contrib import admin
  2.  
  3. # Register your models here.
  4. from .models import *
  5.  
  6. admin.site.register(UserInfo)
  7. admin.site.register(Blog)
  8. admin.site.register(Category)
  9. admin.site.register(Tag)

3.admin的定制

在admin.py中只需要讲Mode中的某个类注册,即可在Admin中实现增删改查的功能,如:

  1. admin.site.register(models.UserInfo)

但是,这种方式比较简单,如果想要进行更多的定制操作,需要利用ModelAdmin进行操作,如:

  1. 复制代码
  2. 方式一:
  3. class UserAdmin(admin.ModelAdmin):
  4. list_display = ('user', 'pwd',)
  5.  
  6. admin.site.register(models.UserInfo, UserAdmin) # 第一个参数可以是列表
  7.  
  8. 方式二:
  9. @admin.register(models.UserInfo) # 第一个参数可以是列表
  10. class UserAdmin(admin.ModelAdmin):
  11. list_display = ('user', 'pwd',)
  12. 复制代码
  13. ModelAdmin中提供了大量的可定制功能,如
  14.  
  15. 1. list_display,列表时,定制显示的列。
  16.  
  17. @admin.register(models.UserInfo)
  18. class UserAdmin(admin.ModelAdmin):
  19. list_display = ('user', 'pwd', 'xxxxx')
  20.  
  21. def xxxxx(self, obj):
  22. return "xxxxx"
  23. 2. list_display_links,列表时,定制列可以点击跳转。
  24.  
  25. @admin.register(models.UserInfo)
  26. class UserAdmin(admin.ModelAdmin):
  27. list_display = ('user', 'pwd', 'xxxxx')
  28. list_display_links = ('pwd',)
  29. 3. list_filter,列表时,定制右侧快速筛选。
  30.  
  31. 4. list_select_related,列表时,连表查询是否自动select_related
  32.  
  33. 5. list_editable,列表时,可以编辑的列
  34.  
  35. @admin.register(models.UserInfo)
  36. class UserAdmin(admin.ModelAdmin):
  37. list_display = ('user', 'pwd','ug',)
  38. list_editable = ('ug',)
  39. 6. search_fields,列表时,模糊搜索的功能
  40.  
  41. @admin.register(models.UserInfo)
  42. class UserAdmin(admin.ModelAdmin):
  43.  
  44. search_fields = ('user', 'pwd')
  45. 7. date_hierarchy,列表时,对DateDateTime类型进行搜索
  46.  
  47. @admin.register(models.UserInfo)
  48. class UserAdmin(admin.ModelAdmin):
  49.  
  50. date_hierarchy = 'ctime'
  51. 8 inlines,详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除
  52.  
  53. 复制代码
  54. class UserInfoInline(admin.StackedInline): # TabularInline
  55. extra = 0
  56. model = models.UserInfo
  57.  
  58. class GroupAdminMode(admin.ModelAdmin):
  59. list_display = ('id', 'title',)
  60. inlines = [UserInfoInline, ]
  61. 复制代码
  62. 9 action,列表时,定制action中的操作
  63.  
  64. 复制代码
  65. @admin.register(models.UserInfo)
  66. class UserAdmin(admin.ModelAdmin):
  67.  
  68. # 定制Action行为具体方法
  69. def func(self, request, queryset):
  70. print(self, request, queryset)
  71. print(request.POST.getlist('_selected_action'))
  72.  
  73. func.short_description = "中文显示自定义Actions"
  74. actions = [func, ]
  75.  
  76. # Action选项都是在页面上方显示
  77. actions_on_top = True
  78. # Action选项都是在页面下方显示
  79. actions_on_bottom = False
  80.  
  81. # 是否显示选择个数
  82. actions_selection_counter = True
  83. 复制代码
  84. 10 定制HTML模板
  85.  
  86. add_form_template = None
  87. change_form_template = None
  88. change_list_template = None
  89. delete_confirmation_template = None
  90. delete_selected_confirmation_template = None
  91. object_history_template = None
  92. 11 raw_id_fields,详细页面,针对FKM2M字段变成以Input框形式
  93.  
  94. @admin.register(models.UserInfo)
  95. class UserAdmin(admin.ModelAdmin):
  96.  
  97. raw_id_fields = ('FK字段', 'M2M字段',)
  98. 12 fields,详细页面时,显示字段的字段
  99.  
  100. @admin.register(models.UserInfo)
  101. class UserAdmin(admin.ModelAdmin):
  102. fields = ('user',)
  103. 13 exclude,详细页面时,排除的字段
  104.  
  105. @admin.register(models.UserInfo)
  106. class UserAdmin(admin.ModelAdmin):
  107. exclude = ('user',)
  108. 14 readonly_fields,详细页面时,只读字段
  109.  
  110. @admin.register(models.UserInfo)
  111. class UserAdmin(admin.ModelAdmin):
  112. readonly_fields = ('user',)
  113. 15 fieldsets,详细页面时,使用fieldsets标签对数据进行分割显示
  114.  
  115. 复制代码
  116. @admin.register(models.UserInfo)
  117. class UserAdmin(admin.ModelAdmin):
  118. fieldsets = (
  119. ('基本数据', {
  120. 'fields': ('user', 'pwd', 'ctime',)
  121. }),
  122. ('其他', {
  123. 'classes': ('collapse', 'wide', 'extrapretty'), # 'collapse','wide', 'extrapretty'
  124. 'fields': ('user', 'pwd'),
  125. }),
  126. )
  127. 复制代码
  128. 16 详细页面时,M2M显示时,数据移动选择(方向:上下和左右)
  129.  
  130. @admin.register(models.UserInfo)
  131. class UserAdmin(admin.ModelAdmin):
  132. filter_vertical = ("m2m字段",) # 或filter_horizontal = ("m2m字段",)
  133. 17 ordering,列表时,数据排序规则
  134.  
  135. @admin.register(models.UserInfo)
  136. class UserAdmin(admin.ModelAdmin):
  137. ordering = ('-id',)

  138. def get_ordering(self, request):
  139. return ['-id', ]
  140. 18. radio_fields,详细页面时,使用radio显示选项(FK默认使用select
  141.  
  142. radio_fields = {"ug": admin.VERTICAL} # 或admin.HORIZONTAL
  143. 19 form = ModelForm,用于定制用户请求时候表单验证
  144.  
  145. 复制代码
  146. from app01 import models
  147. from django.forms import ModelForm
  148. from django.forms import fields
  149.  
  150. class MyForm(ModelForm):
  151. others = fields.CharField()
  152.  
  153. class Meta:
  154. model = models = models.UserInfo
  155. fields = "__all__"
  156.  
  157. @admin.register(models.UserInfo)
  158. class UserAdmin(admin.ModelAdmin):
  159.  
  160. form = MyForm
  161. 复制代码
  162. 20 empty_value_display = "列数据为空时,显示默认值"
  163.  
  164. 复制代码
  165. @admin.register(models.UserInfo)
  166. class UserAdmin(admin.ModelAdmin):
  167. empty_value_display = "列数据为空时,默认显示"
  168.  
  169. list_display = ('user','pwd','up')
  170.  
  171. def up(self,obj):
  172. return obj.user
  173. up.empty_value_display = "指定列数据为空时,默认显示"
  174. 复制代码
  175.  
  176. 复制代码
  177. from django.contrib import admin
  178.  
  179. # Register your models here.
  180.  
  181. from .models import *
  182.  
  183. class BookInline(admin.StackedInline): # TabularInline
  184. extra = 0
  185. model = Book
  186.  
  187. class BookAdmin(admin.ModelAdmin):
  188.  
  189. list_display = ("title",'publishDate', 'price',"foo","publisher")
  190. list_display_links = ('publishDate',"price")
  191. list_filter = ('price',)
  192. list_editable=("title","publisher")
  193. search_fields = ('title',)
  194. date_hierarchy = 'publishDate'
  195. preserve_filters=False
  196.  
  197. def foo(self,obj):
  198.  
  199. return obj.title+str(obj.price)
  200.  
  201. # 定制Action行为具体方法
  202. def func(self, request, queryset):
  203. print(self, request, queryset)
  204. print(request.POST.getlist('_selected_action'))
  205.  
  206. func.short_description = "中文显示自定义Actions"
  207. actions = [func, ]
  208. # Action选项都是在页面上方显示
  209. actions_on_top = True
  210. # Action选项都是在页面下方显示
  211. actions_on_bottom = False
  212.  
  213. # 是否显示选择个数
  214. actions_selection_counter = True
  215.  
  216. change_list_template="my_change_list_template.html"
  217.  
  218. class PublishAdmin(admin.ModelAdmin):
  219. list_display = ('name', 'email',)
  220. inlines = [BookInline, ]
  221.  
  222. admin.site.register(Book, BookAdmin) # 第一个参数可以是列表
  223. admin.site.register(Publish,PublishAdmin)
  224. admin.site.register(Author)

4、admin执行流程

<1> 循环加载执行所有已经注册的app中的admin.py文件

  1. def autodiscover():
  2. autodiscover_modules('admin', register_to=site)

<2> 执行代码

  1. admin.py
  2.  
  3. class BookAdmin(admin.ModelAdmin):
  4. list_display = ("title",'publishDate', 'price')
  5. admin.site.register(Book, BookAdmin)
  1. admin.site.register(Publish)

<3> admin.site

这里应用的是一个单例模式,对于AdminSite类的一个单例模式,执行的每一个app中的每一个admin.site都是一个对象

<4> 执行register方法

  1. admin.site.register(Book, BookAdmin)
  2. admin.site.register(Publish)
  1. class ModelAdmin(BaseModelAdmin):pass
  2.  
  3. def register(self, model_or_iterable, admin_class=None, **options):
  4. if not admin_class:
  5. admin_class = ModelAdmin
  6. # Instantiate the admin class to save in the registry
  7. self._registry[model] = admin_class(model, self)

补充:

admin的URL配置

  1. urlpatterns = [
  2. url(r'^admin/', admin.site.urls),
  3. ]
  1. class AdminSite(object):
  2.  
  3. def get_urls(self):
  4. from django.conf.urls import url, include
  5.  
  6. urlpatterns = []
  7.  
  8. # Add in each model's views, and create a list of valid URLS for the
  9. # app_index
  10. valid_app_labels = []
  11. for model, model_admin in self._registry.items():
  12. urlpatterns += [
  13. url(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
  14. ]
  15. if model._meta.app_label not in valid_app_labels:
  16. valid_app_labels.append(model._meta.app_label)
  17.  
  18. return urlpatterns
  19.  
  20. @property
  21. def urls(self):
  22. return self.get_urls(), 'admin', self.name

url扩展方法,一级分发

  1. from django.shortcuts import HttpResponse
  2. def test01(request):
  3. return HttpResponse("test01")
  4.  
  5. def test02(request):
  6. return HttpResponse("test02")
  7.  
  8. urlpatterns = [
  9. url(r'^admin/', admin.site.urls),
  10. url(r'^yuan/', ([
  11. url(r'^test01/', test01),
  12. url(r'^test02/', test02),
  13.  
  14. ],None,None)),
  15.  
  16. ]

二、单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

在 Python 中,我们可以用多种方法来实现单例模式:

  • 使用模块
  • 使用 __new__
  • 使用装饰器(decorator)
  • 使用元类(metaclass)

1、使用 __new__

为了使类只能出现一个实例,我们可以使用 __new__ 来控制实例的创建过程,代码如下:

  1. class Singleton(object):
  2. _instance = None
  3. def __new__(cls, *args, **kw):
  4. if not cls._instance:
  5. cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
  6. return cls._instance
  7.  
  8. class MyClass(Singleton):
  9. a = 1

在上面的代码中,我们将类的实例和一个类变量 _instance 关联起来,如果 cls._instance 为 None 则创建实例,否则直接返回 cls._instance

执行情况如下:

  1. >>> one = MyClass()
  2. >>> two = MyClass()
  3. >>> one == two
  4. True
  5. >>> one is two
  6. True
  7. >>> id(one), id(two)
  8. (4303862608, 4303862608)

2、使用模块

其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:

  1. # mysingleton.py
  2. class My_Singleton(object):
  3. def foo(self):
  4. pass
  5.  
  6. my_singleton = My_Singleton()

将上面的代码保存在文件 mysingleton.py 中,然后这样使用:

  1. from mysingleton import my_singleton
  2.  
  3. my_singleton.foo()

【django之admin,单例模式】的更多相关文章

  1. django之admin流程

    admin 类复习: class Base(object): def __init__(self,val): self.val = val def func(self): self.test() pr ...

  2. Django的admin.py注册流程

    通常创建一个Django项目的时候,在Django的配置文件settings.py中,都会有下面的这段配置: INSTALLED_APPS = [ 'django.contrib.admin', 'd ...

  3. Django之admin的使用和源码剖析

    admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTALLE ...

  4. Django 之 admin管理工具

    -------------------------------------------------------------------------妄尝恶果,苦果自来. admin组件使用 Django ...

  5. Django的 admin管理工具

    admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTALLE ...

  6. Django 中 admin 的执行流程

    Django 中 admin 的执行流程 1 循环加载执行所有已经注册的 app 中的 admin.py 文件 def autodiscover(): autodiscover_modules('ad ...

  7. Django 之 admin组件使用&源码解析

    admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.可以在项目的 settings.py 中的 INSTALLED ...

  8. Django之admin的使用及源码分析

    一.admin组件使用 Django本身提供了基于 web 的管理工具.其管理工具是django.contrib的一部分,可在settings.py中的 INSTALLED_APPS 看到: INST ...

  9. [django]Django站点admin支持中文显示和输入设置

    正文: Django站点admin支持中文输入设置,操作如下: 1 需要确定的你的数据库的client客户端和服务端的编码设置为utf-8,如果不是,请将其设置成utf-8编码,我采用mysql,详情 ...

随机推荐

  1. 小委出发vijos-1572 jdoj-1572

    小委出发 题目大意:一个长度为n的字符串,由()[]{}组成.求最长的和谐字符串:我们对最长和谐字符串的定义就是每一个括号有一个性质相同的括号与之匹配,这两个括号中间要么为空,要么也是和谐的.几个连续 ...

  2. mode

    mode (jdoj-2905) 题目大意:给你一个n个数的数列,其中某个数出现了超过$\lfloor\frac{n}{2}\rfloor$即众数,请你找出那个数. 注释:n<=$5\cdot ...

  3. Object类-----java

    Object类是所有类的父类,如果一个类没有使用extends关键字明确标识继承另一个类,那么这类默认继承object类 Object类中的方法,适合所有子类. 1 toString()方法在Obje ...

  4. SSDB安装配置 ERROR! autoconf required! install autoconf first

    SSDB简介 SSDB是一个C/C++语言开发的高性能开源NoSQL数据库服务器,支持Key-value, Keyhashmap, Key-zset(sorted set) 等数据结构,十分适合存储数 ...

  5. 用 Go 编写一个简单的 WebSocket 推送服务

    用 Go 编写一个简单的 WebSocket 推送服务 本文中代码可以在 github.com/alfred-zhong/wserver 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...

  6. 掌握SQLServer锁的相关概念

    一.为什么要引入锁 当多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: ◆丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 ◆脏读 ...

  7. 2017-2018-1 20155201 《信息安全系统设计基础》 pwd命令的实现

    2017-2018-1 20155201 <信息安全系统设计基础> pwd命令的实现 一.对pwd命令的学习 在终端中输入man pwd查看手册中对pwd这一命令的解释: 以绝对路径的方式 ...

  8. 项目Beta冲刺第二天

    1.昨天的困难,今天解决的进度,以及明天要做的事情 昨天的困难:昨天主要是在确认需求方面花了一些时间,后来终于确认了企业自查风险模块的需求问题 今天解决的进度:根据昨天确认下来的需求,我们基本上完成了 ...

  9. Bate敏捷冲刺每日报告--day4

    1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285)  Git链接:https://github.com/WHUSE2017/C-team 2 ...

  10. centos 开放端口

    1.修改文件/etc/sysconfig/iptables [root@zsq ~]# cd /etc/sysconfig/[root@zsq sysconfig]# vi iptables 文件内容 ...