前言:

当我们启动1个Django程序的时候,在程序的settings.py配置文件默认注册了1个名为'django.contrib.admin'的APP程序,并且配置了默认路由映射关系url(r'^admin/', admin.site.urls),这就是我们在安装Django时安装的后台管理插件DjangoAdmin,帮助我们快速对在model中定义的类(表)做增、删、改、查操作;

一、DjangoAdmin的基本使用

0、准备

创建admin后台管理用户

python manage.py createsuperuser

修改用户名密码

D:\Sensors_Data>python manage.py changepassword zhanggen
Changing password for user 'zhanggen'
Password:
Password (again):
Passwords do not match. Please try again.
Password:
Password (again):
Password changed successfully for user 'zhanggen'

创建数据库表

from django.db import models

class UserGroup(models.Model):
title = models.CharField(verbose_name='组名称',max_length=32)
def __str__(self):
return self.title class Role(models.Model):
name= models.CharField(verbose_name='角色名称',max_length=32) class UserInfo(models.Model):
group = models.ForeignKey(verbose_name='用户组',to=UserGroup,null=True,blank=True)
name = models.CharField(verbose_name='用户名',max_length=32)
nickname = models.CharField(verbose_name='昵称',max_length=32,null=True,blank=True)
email = models.EmailField(verbose_name='邮箱',max_length=32)
ctime = models.DateTimeField(verbose_name='创建时间',null=True,blank=True)
roles = models.ManyToManyField(verbose_name='角色',to=Role)
def __str__(self):
return self.name

将表注册到admin.py

from django.contrib import admin

from . import models
admin.site.register(models.UserInfo)
admin.site.register(models.UserGroup)

设置编码

ALTER TABLE django_admin_log MODIFY COLUMN object_repr VARCHAR(255)  CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

setings.py设置中文版DjangoAdmin

LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'

1、使用DjangoAdmin进行数据库表的增、删、改、查操作,发现URL规则;

查看X表数据:DjangoAdmin生成url:  http://127.0.0.1:8000/admin/app01/userinfo/

增加X表数据:DjangoAdmin生成url:  http://127.0.0.1:8000/admin/app01/userinfo/add/

删除X表数据:DjangoAdmin生成url:  http://127.0.0.1:8000/admin/app01/userinfo/2/del/

编辑X表数据:DjangoAdmin生成url:  http://127.0.0.1:8000/admin/app01/userinfo/2/change/

发下URL规则:/app名称/表名/pk/操作

2、产生疑问 DjangoAdmin的URL是怎么通过组册到admin的表名自动生成的呢?

这就要看这行代码做了什么?

url(r'^admin/', admin.site.urls),

2.1.返回self.get_urls(),方法, 'admin', self.name

2.2.site对象的get_urls方法生成登录、注销、设置密码。。。url映射关系

2.3、还有

2.4、生成增、删、改、查的路由

2.5、猜想:Djangoadmin根据admin.py中注册的表名,自动生成/app名称/表名/pk/操作 这样的url映射关系

二、自定义DjangoAdmin配置对象

 1、通过 list_display列表,自定制显示数据库中已有列

from django.contrib import admin

from . import models

class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname'] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段 admin.site.register(models.UserInfo,Zhanggen)
admin.site.register(models.UserGroup)

通过装饰器的方式自定义配置类

@admin.register(models.UserInfo)  #使用装饰器的方法,注册表到admin
class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','xx',] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
def xx(self,obj): #obj =当前行的对象
# return '自定义列'+obj.name
tpl=mark_safe('<a href="http://news.baidu.com/?tn=news/">链接</a>'.format(obj.pk))
return tpl # admin.site.register(models.UserInfo,Zhanggen) #支持表名使用[models.UserInfo,models.Group],共同使用zhangen配置,一般不常用
admin.site.register(models.UserGroup)

2、通过 list_display列表,自定制显示的列(数据库中没有的字段)

from django.contrib import admin
from . import models
from django.utils.safestring import mark_safe class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','xx',] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
def xx(self,obj): #obj =当前行的对象
# return '自定义列'+obj.name
tpl=mark_safe('<a href="http://news.baidu.com/?tn=news/">链接</a>'.format(obj.pk))
return tpl admin.site.register(models.UserInfo,Zhanggen)
admin.site.register(models.UserGroup)

3、list_display_links 设置显示的列可以跳转

from django.contrib import admin
from . import models
from django.utils.safestring import mark_safe # @admin.register(models.UserInfo) #使用装饰器的方法,注册表到admin
class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','xx',] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
list_display_links = ['name','nickname'] #定制可以跳转的字段
def xx(self,obj): #obj =当前行的对象
# return '自定义列'+obj.name
tpl=mark_safe('<a href="http://news.baidu.com/?tn=news/">链接</a>'.format(obj.pk))
return tpl admin.site.register(models.UserInfo,Zhanggen) #支持表名使用[models.UserInfo,models.Group],共同使用zhangen配置,一般不常用
admin.site.register(models.UserGroup)

4、list_filter = ['group']  定制右侧筛选条件

from django.contrib import admin
from . import models
from django.utils.safestring import mark_safe # @admin.register(models.UserInfo) #使用装饰器的方法,注册表到admin
class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname',] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
list_display_links = ['name','nickname',] #定制可以跳转的字段
list_filter = ['group','name'] #定制右侧筛选条件
# def xx(self,obj): #obj =当前行的对象
# # return '自定义列'+obj.name
# tpl=mark_safe('<a href="http://news.baidu.com/?tn=news/">链接</a>'.format(obj.pk))
# return tpl admin.site.register(models.UserInfo,Zhanggen) #支持表名使用[models.UserInfo,models.Group],共同使用zhangen配置,一般不常用
admin.site.register(models.UserGroup)

自定制筛选分组 和页面数据筛选条件

from django.contrib import admin
from . import models
from django.utils.translation import ugettext_lazy as _
from django.utils.safestring import mark_safe # @admin.register(models.UserInfo) #使用装饰器的方法,注册表到admin
class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','group'] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
# list_display_links = ['name','nickname',] #定制可以跳转的字段 #自定制 分组 和筛选的条件
class Ugg(admin.SimpleListFilter):
title = _('圣诞快乐的解决')
parameter_name = 'xxxxxx' #点击组名 a标签携带的值,执行queryset方法 def lookups(self, request, model_admin):
"""
显示筛选选项
:param request:
:param model_admin:
:return:
"""
return models.UserGroup.objects.values_list('id','title') def queryset(self, request, queryset):
"""
点击筛选查询时候,筛选用户表符合筛选条件的内容
"""
v = self.value()
if v:
return queryset.filter(group_id=v)
else:
return queryset # print(queryset) #查询userinfo表的全部数据 list_filter = ['group',Ugg] #定制右侧筛选条件,通用场景把组里所有的人列出来
# def xx(self,obj): #obj =当前行的对象
# # return '自定义列'+obj.name
# tpl=mark_safe('<a href="http://news.baidu.com/?tn=news/">链接</a>'.format(obj.pk))
# return tpl admin.site.register(models.UserInfo,Zhanggen) #支持表名使用[models.UserInfo,models.Group],共同使用zhangen配置,一般不常用
admin.site.register(models.UserGroup)

5、list_select_related = ['group'],如果显示的列间存在foreign key关系,可以自动select_related,提高性能;

6、分页相关

  list_per_page = 1  #一页显示数据库中多少条数据
list_max_show_all = 200 #最大显示行数
paginator = Paginator

7、list_editable = ['nickname', ]进入编辑模式

class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_editable = ['nickname', ] #进入编辑模式
list_display = ['name','nickname','group']

8、search_fields = ('name',) #根据字段,做模糊搜索功能

class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
search_fields = ('name',)
list_display = ['name','nickname','group'] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段

9、 date_hierarchy = 'ctime',列表时,对Date和DateTime类型进行搜索

class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
date_hierarchy = 'ctime' #根据时间进行筛选

10、preserve_filters=True,页面跳转回来之后保留搜素条件

10、 save_as = False,详细页面,按钮为“Sava as new” 或 “Sava and add another”

11.、save_as_continue = True,点击保存并继续编辑

12、inlines = [UserInfoInline, ],在操作foreign key的表时,联动操作从表;(在增加组的时候,也可以增加组里的用户)

class UserInfoInline(admin.StackedInline):  # TabularInline
extra = 0
model = models.UserInfo class GroupAdminMode(admin.ModelAdmin):
list_display = ( 'title',)
inlines = [UserInfoInline, ] admin.site.register(models.UserGroup,GroupAdminMode)

主表和从表直间 横向显示,继承TabularInline类

class UserInfoInline(admin.TabularInline):  # 继承TabularInline类,排列的方式不同
extra = 0
model = models.UserInfo class GroupAdminMode(admin.ModelAdmin):
list_display = ( 'title',)
inlines = [UserInfoInline, ] admin.site.register(models.UserGroup,GroupAdminMode)

13、扩展admin的操作,actions = [zhanggen,]   例如:增、删、改、查

class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','group','ctime'] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
search_fields = ('name',) # 根据字段搜素,框
def zhanggen(self,request,queset):
print(self,request,queset)
print(request.POST.getlist('_selected_action')) #拿到前端选择 的id
zhanggen.short_description = '中文显示自定义Actions'
actions = [zhanggen,]

14、change_list_template = ['test.html']  把DjangoAdmin的路径,更换成自己的模板路径;

class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','group','ctime'] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
change_list_template = ['test.html'] #更换自己的查询时显示模板路径
add_form_template = ['add.ttml'] #增加
delete_confirmation_template = None #删除
delete_selected_confirmation_template = None ##选中之后批量
object_history_template = None

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

class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','group','ctime'] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
raw_id_fields = ('group', 'roles',) #在详细页面,把'FK字段', 'M2M字段'显示成input框

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

class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','group','ctime'] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
fields = ['name','nickname'] #定义显示页面,显示的字段

17、exclude = ['name'] 配置显示页面,不显示的字段

class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','group','ctime'] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
exclude = ['name'] #定义显示页面,不显示的字段

18、readonly_fields = ['name'] 配置显示页面,某字段只读不允许修改

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

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
fieldsets = (
('基本数据', {
'fields': ('user', 'pwd', 'ctime',)
}),
('其他', {
'classes': ('collapse', 'wide', 'extrapretty'), # 'collapse','wide', 'extrapretty'
'fields': ('user', 'pwd'),
}),
)

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

class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','group','ctime'] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
filter_vertical = ("roles",) #选中多对多字段时,上下显示
filter_horizontal=('roles') #选中多对多字段时,左右显示

21、ordering = ('-id',)  数据排序规则

class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','group','ctime'] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
# ordering = ('id',) #按id大小 排序显示
ordering = ('-id',)#倒序显示

22、view_on_site,编辑页面,显示view on set按钮,可以设置 跳转会显示页面

class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','group','ctime'] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段 def view_on_site(self, obj):
return 'https://www.baidu.com'

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

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

24、show_full_result_count = True,列表时,模糊搜索后面显示的数据个数样式

class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','group','ctime'] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
search_fields = ('user',)
show_full_result_count = True # 1 result (12 total)

25、 formfield_overrides = {},详细页面时,指定现实插件

from django.forms import widgets
from django.utils.html import format_html class MyTextarea(widgets.Widget):
def __init__(self, attrs=None):
# Use slightly better defaults than HTML's 20x2 box
default_attrs = {'cols': '', 'rows': ''}
if attrs:
default_attrs.update(attrs)
super(MyTextarea, self).__init__(default_attrs) def render(self, name, value, attrs=None):
if value is None:
value = ''
final_attrs = self.build_attrs(attrs, name=name)
return format_html('<textarea {}>\r\n{}</textarea>',final_attrs, value) @admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin): formfield_overrides = {
models.models.CharField: {'widget': MyTextarea},
}

26、prepopulated_fields = {},同步填充input框中的数据

class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','group','ctime'] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
prepopulated_fields = {"email": ("name", "nickname",)}

27. form = ModelForm,自定义 表单验证组件

from django.contrib import admin
from django.core.paginator import Paginator
from . import models
from django.utils.translation import ugettext_lazy as _
from django.utils.safestring import mark_safe
from django.forms import ModelForm
from django.forms import fields class MyForm(ModelForm):
others = fields.CharField() class Meta:
model = models = models.UserInfo
fields = "__all__"
error_messages = {'name': {'required': '用户不能为空'}} # @admin.register(models.UserInfo) #使用装饰器的方法,注册表到admin
class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','group','ctime'] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
form = MyForm

28. empty_value_display = "列数据为空时,设置显示默认值"

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

三、DjangoAdmin配置总结:

每个注册到DjangoAdmin的1张表对应一个自定制类(继承admin.ModelAdmin默认配置类),表中数据按配置进行显示;2张表的自定义的配置类相互不影响,如果没有自定义配置类,会自动使用默认配置;

使用:

1、在model.py中创建表

2、把表名注册到admin.py

A、admin.site.registe(表名,自定义配置类)

admin.site.register(models.UserInfo,Zhanggen)

B、装饰器方式注册表

# @admin.register(models.UserInfo)  #使用装饰器的方法,注册表到admin

3.自定义配置类,扩展功能

类名(admin.ModelAdmin)注意继承默认配置,才能扩展功能;

class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
list_display = ['name','nickname','group','ctime'] #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
form = MyForm

通过在每张表中 定义配置类的静态字段,显示表中内容

4、自动生成了表名对应的URL映射发下URL规则:/app名称/表名/pk/操作

参考博客链接银角大王:http://www.cnblogs.com/wupeiqi/articles/7444717.html

Django之DjangoAdmin的更多相关文章

  1. django运行django-admin.py无法创建网站

    安装django的步骤: 1.安装python,选择默认安装在c盘即可.设置环境变量path,值添加python的安装路径. 2.下载ez_setup.py,下载地址:http://peak.tele ...

  2. win7下,使用django运行django-admin.py无法创建网站

    安装django的步骤: 1.安装python,选择默认安装在c盘即可.设置环境变量path,值添加python的安装路径. 2.下载ez_setup.py,下载地址:http://peak.tele ...

  3. django安装好之后,django-admin仍然不能使用的问题

    我使用的是python3,python3不能找到django的正确位置.需要下面这样才能正确建立mysite python3 /usr/lib/python2./site-packages/djang ...

  4. 解决win10创建Django工程,运行django-admin.py startproject 工程名,失败的问题

          在看我这篇教程的前提是你应该已经正确装好python和Django了,好了,废话不说了,正题走你!你现在是不是很纠结自己运行django-admin.py startproject 工程名 ...

  5. django 第二天 制作小demo

    创建虚拟目录 mkdir ~/virtualenvs mkdir ~/virtualenvs/myprojectenv virtualenv ~/virtualenvs/myprojectenv 激活 ...

  6. python框架之django

    python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django temple django models ...

  7. Django基础之安装配置

    安装配置 一 MVC和MTV模式 著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的 ...

  8. 冰冻三尺非一日之寒--Django框架【进阶篇】

    第十九章  Django进阶 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...

  9. 冰冻三尺非一日之寒--web框架Django

    1.JS 正则    test   - 判断字符串是否符合规定的正则        rep = /\d+/;        rep.test("asdfoiklfasdf89asdfasdf ...

随机推荐

  1. geoserver源码学习与扩展——自动发布shapefile图层

    geoserver通过工作空间Workspace-数据源DataStore-图层Layer管理地理数据,这些信息都通过Catalog进行组织和管理,要完成自动发布只需要在Catalog中增加相应的信息 ...

  2. 【Python】【socket】

    [server.py] """#练习1import socketimport threading sock = socket.socket()sock.bind(('12 ...

  3. 录音 voice record

    参考 : http://air.ghost.io/recording-to-an-audio-file-using-html5-and-js/ (html5 基础) https://github.co ...

  4. sublime text---注释

    Sublime在进行前端开发时非常棒,当然也少不了众多的插件支持,DocBlocker是在Sublime平台上开发一款自动补全代码插件,支持JavaScript (including ES6), PH ...

  5. v891 安卓平板的root

    看了 油管的视频,标题:Onda V891 - Root Android 4.4.4 (Kit Kat) 2)下载工具,照着做就行了. 3)root完之后,安装 [钛备份](TitaniumBacku ...

  6. Ruby 基础教程 第一部分总结

    第一部分:Ruby 初体验 第一章: Ruby 初探 前言 开头的这一章节讲了一些十分基础的内容,重要的几个话题有: ruby 命令的执行方法 对象.方法的概念 常见的打印方法 ruby 命令的执行方 ...

  7. 雷林鹏分享:jQuery EasyUI 表单 - 创建异步提交表单

    jQuery EasyUI 表单 - 创建异步提交表单 本教程向您展示如何通过 easyui 提交一个表单(Form).我们创建一个带有 name.email 和 phone 字段的表单.通过使用 e ...

  8. xsd与xml和类(class)对象之间的互相转换

    xsd与xml和类(class)对象之间的互相转换 . 第一:通过现有的已经写好的xsd来生成class(.cs)文件. 在您Visual Studio的安装目录下的SDKv2.0Bin中有个应用程序 ...

  9. 时钟中断TIMER_BH(bottom_half)实现分析

    017-12-6 16:27:35时钟中断TIMER_BH(bottom_half)实现分析1.3.1001. 时钟0号中断安装    setup_x86_irq(0, &irq0);@arc ...

  10. vue.js如何实现点击按钮动态添加li

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...