Django 提供了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基本代码的组成部分。

使用管理工具

先用 python manage.py startapp app01 创建一个app,然后在models.py中创建相应的类进行数据库迁移使用python manage.py makemigrations 和 python manage.py migrate 
启动开发服务器,然后在浏览器中访问 http://127.0.0.1:8000/admin/,得到登陆界面,你可以通过命令 python manage.py createsuperuser 来创建超级用户。

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

  1. from django.db import models
  2.  
  3. class Author(models.Model):
  4.  
  5. name=models.CharField( max_length=32)
  6. age=models.IntegerField()
  7.  
  8. def __str__(self):
  9. return self.name
  10.  
  11. class Publish(models.Model):
  12.  
  13. name=models.CharField( max_length=32)
  14. email=models.EmailField()
  15.  
  16. def __str__(self):
  17. return self.name
  18.  
  19. class Book(models.Model):
  20.  
  21. title = models.CharField( max_length=32)
  22. publishDate=models.DateField()
  23. price=models.DecimalField(max_digits=5,decimal_places=2)
  24.  
  25. publisher=models.ForeignKey(to="Publish")
  26. authors=models.ManyToManyField(to='Author')
  27.  
  28. def __str__(self):
  29. return self.title

admin的定制

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

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

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

方式一

  1. class UserAdmin(admin.ModelAdmin):
  2. list_display = ('user', 'pwd',)
  3.  
  4. admin.site.register(models.UserInfo, UserAdmin) # 第一个参数可以是列表

方式二:

  1. @admin.register(models.UserInfo) # 第一个参数可以是列表
  2. class UserAdmin(admin.ModelAdmin):
  3. list_display = ('user', 'pwd',)

ModelAdmin中提供了大量的可定制功能,如

1. list_display,列表时,定制显示的列。

  1. @admin.register(models.UserInfo)
  2. class UserAdmin(admin.ModelAdmin):
  3. list_display = ('user', 'pwd', 'xxxxx')
  4.  
  5. def xxxxx(self, obj):
  6. return "xxxxx"

2. list_display_links,列表时,定制列可以点击跳转。

  1. @admin.register(models.UserInfo)
  2. class UserAdmin(admin.ModelAdmin):
  3. list_display = ('user', 'pwd', 'xxxxx')
  4. list_display_links = ('pwd',)

3. list_filter,列表时,定制右侧快速筛选。

4. list_select_related,列表时,连表查询是否自动select_related

5. list_editable,列表时,可以编辑的列

  1. @admin.register(models.UserInfo)
  2. class UserAdmin(admin.ModelAdmin):
  3. list_display = ('user', 'pwd','ug',)
  4. list_editable = ('ug',)

6. search_fields,列表时,模糊搜索的功能

  1. @admin.register(models.UserInfo)
  2. class UserAdmin(admin.ModelAdmin):
  3. search_fields = ('user', 'pwd')

7. date_hierarchy,列表时,对Date和DateTime类型进行搜索

  1. @admin.register(models.UserInfo)
  2. class UserAdmin(admin.ModelAdmin):
  3. date_hierarchy = 'ctime'

8  inlines,详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除

  1. class UserInfoInline(admin.StackedInline): # TabularInline
  2. extra = 0
  3. model = models.UserInfo
  4.  
  5. class GroupAdminMode(admin.ModelAdmin):
  6. list_display = ('id', 'title',)
  7. inlines = [UserInfoInline, ]

9 action,列表时,定制action中的操作

  1. @admin.register(models.UserInfo)
  2. class UserAdmin(admin.ModelAdmin):
  3.  
  4. # 定制Action行为具体方法
  5. def func(self, request, queryset):
  6. print(self, request, queryset)
  7. print(request.POST.getlist('_selected_action'))
  8.  
  9. func.short_description = "中文显示自定义Actions"
  10. actions = [func, ]
  11.  
  12. # Action选项都是在页面上方显示
  13. actions_on_top = True
  14. # Action选项都是在页面下方显示
  15. actions_on_bottom = False
  16.  
  17. # 是否显示选择个数
  18. actions_selection_counter = True

10 定制HTML模板

  1. add_form_template = None
  2. change_form_template = None
  3. change_list_template = None
  4. delete_confirmation_template = None
  5. delete_selected_confirmation_template = None
  6. object_history_template = None

11 raw_id_fields,详细页面,针对FK和M2M字段变成以Input框形式

  1. @admin.register(models.UserInfo)
  2. class UserAdmin(admin.ModelAdmin):
  3. raw_id_fields = ('FK字段', 'M2M字段',)

12  fields,详细页面时,显示字段的字段

  1. @admin.register(models.UserInfo)
  2. class UserAdmin(admin.ModelAdmin):
  3. fields = ('user',)

13 exclude,详细页面时,排除的字段

  1. @admin.register(models.UserInfo)
  2. class UserAdmin(admin.ModelAdmin):
  3. exclude = ('user',)

14  readonly_fields,详细页面时,只读字段

  1. @admin.register(models.UserInfo)
  2. class UserAdmin(admin.ModelAdmin):
  3. readonly_fields = ('user',)

15 fieldsets,详细页面时,使用fieldsets标签对数据进行分割显示

  1. @admin.register(models.UserInfo)
  2. class UserAdmin(admin.ModelAdmin):
  3. fieldsets = (
  4. ('基本数据', {
  5. 'fields': ('user', 'pwd', 'ctime',)
  6. }),
  7. ('其他', {
  8. 'classes': ('collapse', 'wide', 'extrapretty'), # 'collapse','wide', 'extrapretty'
  9. 'fields': ('user', 'pwd'),
  10. }),
  11. )

16 详细页面时,M2M显示时,数据移动选择(方向:上下和左右)

  1. @admin.register(models.UserInfo)
  2. class UserAdmin(admin.ModelAdmin):
  3. filter_vertical = ("m2m字段",) # 或filter_horizontal = ("m2m字段",)

17 ordering,列表时,数据排序规则

  1. @admin.register(models.UserInfo)
  2. class UserAdmin(admin.ModelAdmin):
  3. ordering = ('-id',)

  4. def get_ordering(self, request):
  5. return ['-id', ]

18. radio_fields,详细页面时,使用radio显示选项(FK默认使用select)

  1. radio_fields = {"ug": admin.VERTICAL} # 或admin.HORIZONTAL

19 form = ModelForm,用于定制用户请求时候表单验证

  1. from app01 import models
  2. from django.forms import ModelForm
  3. from django.forms import fields
  4.  
  5. class MyForm(ModelForm):
  6. others = fields.CharField()
  7.  
  8. class Meta:
  9. model = models = models.UserInfo
  10. fields = "__all__"
  11.  
  12. @admin.register(models.UserInfo)
  13. class UserAdmin(admin.ModelAdmin):
  14.  
  15. form = MyForm

20 empty_value_display = "列数据为空时,显示默认值"

  1. @admin.register(models.UserInfo)
  2. class UserAdmin(admin.ModelAdmin):
  3. empty_value_display = "列数据为空时,默认显示"
  4.  
  5. list_display = ('user','pwd','up')
  6.  
  7. def up(self,obj):
  8. return obj.user
  9. up.empty_value_display = "指定列数据为空时,默认显示"
 

Admin的源码解析

单例模式

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

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

实现单例模式的方式

  1. 使用模块
  2. 使用 __new__
  3. 使用装饰器(decorator
  4. 使用元类(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. my_singleton.foo()

admin执行流程

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

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

<2> 执行代码

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

> 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. def register(self, model_or_iterable, admin_class=None, **options):
  3. if not admin_class:
  4. admin_class = ModelAdmin
  5. # Instantiate the admin class to save in the registry
  6. self._registry[model] = admin_class(model, self)

到这里,注册结束!

<5> admin的URL配置

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

<6>  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. ]

扩展优化

  1. from django.conf.urls import url,include
  2. from django.contrib import admin
  3. from django.shortcuts import HttpResponse
  4. def change_list_view(request):
  5. return HttpResponse("change_list_view")
  6. def add_view(request):
  7. return HttpResponse("add_view")
  8. def delete_view(request):
  9. return HttpResponse("delete_view")
  10. def change_view(request):
  11. return HttpResponse("change_view")
  12. def get_urls():
  13. temp=[
  14. url(r"^$".format(app_name,model_name),change_list_view),
  15. url(r"^add/$".format(app_name,model_name),add_view),
  16. url(r"^\d+/del/$".format(app_name,model_name),delete_view),
  17. url(r"^\d+/change/$".format(app_name,model_name),change_view),
  18. ]
  19.  
  20. return temp
  21. url_list=[]
  22. for model_class,obj in admin.site._registry.items():
  23. model_name=model_class._meta.model_name
  24. app_name=model_class._meta.app_label
  25. # temp=url(r"{0}/{1}/".format(app_name,model_name),(get_urls(),None,None))
  26. temp=url(r"{0}/{1}/".format(app_name,model_name),include(get_urls()))
  27. url_list.append(temp)
  28.  
  29. urlpatterns = [
  30. url(r'^admin/', admin.site.urls),
  31. url(r'^yuan/', (url_list,None,None)),
  32. ]

参照admin的url路径分发

  1. #############models.py###########
  2. from django.db import models
  3. class Book(models.Model):
  4. title = models.CharField(max_length=32)
  5. author = models.ForeignKey(to='Author')
  6. class Author(models.Model):
  7. name = models.CharField(max_length=32)
  8. #################admin.py###########
  9. from app01.models import *
  10. admin.site.register(Book)
  11. admin.site.register(Author)
  12. ##############views.py################
  13. from django.shortcuts import HttpResponse
  14. def add(request):
  15. return HttpResponse('add')
  16. def change(request,id):
  17. return HttpResponse('change')
  18. def delete(request,id):
  19. return HttpResponse('delete')
  20. def show(request):
  21. return HttpResponse('show')
  22. ################url.py##############
  23. def get_urls2():
  24. tmp = []
  25. tmp.append(url(r'^add/',add))
  26. tmp.append(url(r'^(\d+)/change/',change))
  27. tmp.append(url(r'^(\d+)/delete/',delete))
  28. tmp.append(url(r'^',show))
  29. return tmp
  30. def get_urls():
  31. temp = []
  32. for model, admin_class_obj in admin.site._registry.items():
  33. model_name = model._meta.model_name
  34. app_label = model._meta.app_label
  35. temp.append(url(r'^{}/{}/'.format(app_label,model_name),(get_urls2(),None,None))) #[url(r'^app01/book/',),]
  36. return temp
  37.  
  38. urlpatterns = [
  39. url(r'^admin/', (get_urls(), None, None)),
  40. url(r'^admin/', admin.site.urls),
  41. ]

原文:https://www.cnblogs.com/bypp/p/8989308.html

django admin.py 外键,反向查询

  1. class OrderAdmin(admin.ModelAdmin):
  2. list_display = (
  3. '_nick_name', 'time_order', 'year', 'item', 'status', 'number',
  4. 'money', 'deduction_point', 'deduction_account', 'pay',
  5. '_open_id', 'out_trade_no', )
  6. search_fields = [
  7. 'user__nick_name', 'user__wechatuser__open_id',
  8. 'out_trade_no']
  9. list_filter = ('year', 'item', 'status')
  10.  
  11. def _nick_name(self, obj):
  12. return obj.user.nick_name
  13.  
  14. def _open_id(self, obj):
  15. return obj.user.wechatuser.open_id
  16.  
  17. list_display中如果查询外键, 需要自己写方法.例如上面代码中的_nick_name_open_id
  18. search_fields中可以直接用外键的形式直接访问

  

Django--Admin 组件的更多相关文章

  1. 自定义 Django admin 组件

    摘要:学习 Django admin 组件,仿照源码的逻辑,自定义了一个简易的 stark 组件,实现类似 admin 的功能. 可自动生成 url 路由,对于model 有与之相应的配置类对象,可进 ...

  2. Django admin 组件 原理分析与扩展使用 之 sites.py (一)

    一 . 前言 Django 提供了admin 组件 为项目提供基本的管理后台功能(对数据表的增删改查). 本篇文章通过 admin源码 简单分析admin 内部原理 ,扩展使用方式,为以后进行定制和自 ...

  3. Django admin组件使用

    ADMIN 组件 介绍 admin 组件实现了更方便的WEB后台数据管理方式 settings.py 中第一个组件就是 : INSTALLED_APPS = [ 'django.contrib.adm ...

  4. Django admin组件源码流程

    admin 组件 Django 自带的用户后台组件 用于用户便携的操作 admin 组件核心 启动 注册 设计url 启动核心代码 每个app 通过 apps.py 扫描 admin.py 文件 并执 ...

  5. day 82 Django Admin组件.

    一.先建表环境 modules文件 from django.db import models # Create your models here. from django.contrib.auth.m ...

  6. Django——admin组件

    Django提供了基于web的管理工具. Django自动管理工具是django.contrib的一部分.你可以在项目的settings.py中的INSTALLED_APPS看到它: # Applic ...

  7. python框架之Django(13)-admin组件

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

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

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

  9. django之admin组件

    一.面向对象复习 1.类的继承 class Base(object): def __init__(self,val): self.val = val def func(self): self.test ...

  10. Django之 admin组件

    本节内容 路由系统 models模型 admin  views视图 template模板 Django Admin介绍 admin 是django 自带的用来让你进行数据库管理的web app. 提供 ...

随机推荐

  1. 491. Increasing Subsequences增长型序列

    [抄题]: Given an integer array, your task is to find all the different possible increasing subsequence ...

  2. 65. Valid Number 判断字符串是不是数字

    [抄题]: Validate if a given string is numeric. Some examples:"0" => true" 0.1 " ...

  3. swift 监测内存泄漏 MLeaksFinder

    使用MLeaksFinder检测项目内存泄露总结 https://www.cnblogs.com/ocarol/p/5288497.html

  4. [leetcode]41. First Missing Positive第一个未出现的正数

    Given an unsorted integer array, find the smallest missing positive integer. Example 1: Input: [1,2, ...

  5. MySQL开发——【介绍、安装】

    什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 数据库的分类? 关系型数据库 ...

  6. oracle 区分大小写遇到的坑

    1. oracle 字段是区分大小写的 ..在navicat 中使用查询 select REMAIN_PRINCIPAl from T_NF_PROJECT;    navicat 默认会把 REMA ...

  7. git stash错误小记

    git出错小记 想要push代码,我们经常这样做. 1.查看状态 git status 2.隐藏本地编辑的新内容 git stash 3.拉远程的代码 git pull 这一步操作有的时候会报错,没有 ...

  8. mui几种页面跳转方式对比

    1.初始化时创建子页面 mui.init({ subpages: [{ url: your - subpage - url, //子页面HTML地址,支持本地地址和网络地址 id: your - su ...

  9. Java 浮点数相加

    刚刚遇到个需求,需要对金额求和,上线的时候才知道这时个,这个字段是个小数. 随手就改了个Double ,然后,跑下,没啥问题,直接上线了 然后,就fuck 了 加出一大堆的小数,大概是这样的 pack ...

  10. 获取IP地址方法

    function getip() {     static $ip = '';     $ip = $_SERVER['REMOTE_ADDR'];     if(isset($_SERVER['HT ...