一、django admin前言

  1、admin的作用

    为了方便后台开发者快速的部署测试环境,于是就产生了admin,admin主要是操作models中的类从而实现对数据库中的数据增删改查的操作。

  2、admin的使用环境

    1、首先项目中的models.py必须要有相应的类

    from django.db import models
    class UserInfo(models.Model):
   name=models.CharField(max_length=32)
   email=models.EmailField(max_length=32)
    class GroupInfo(models.Model):
   groupname=models.CharField(max_length=32)
   nickname=models.CharField(max_length=32)

      2、然后在项目中的admin.py设置admin所需要操作哪些类(相当于为表注册路由)

    from django.contrib import admin
    from . import models
    admin.site.register(models.UserInfo)
    admin.site.register(models.GroupInfo)

  3、admin.py设置成功之后就会自动注册路由(自动注册路由要参考django源码),路由格式如下:

	/admin/app01/userinfo/   			查看表数据 change_list_view
/admin/app01/userinfo/add/ 增加表数据 方法
/admin/app01/userinfo/2/change/ 修改表数据 方法 2指代的是主键id号
/admin/app01/userinfo/2/delete/ 删除表数据 方法
    注释:app01指代的是项目名,在哪个项目下创建数据库就写的是哪个项目,userinfo指代的是项目下的表名,然后后面就是对该表进行增删改查的相关操作。     除此之外还会创建别的路由映射关系
    /admin/
    /admin/login/
    /admin/logout/
    /admin/password_change/
    /admin/password_change/done/  
    /admin/app名称/model名称/
    /admin/app名称/model名称/add/
    /admin/app名称/model名称/ID值/history/
    /admin/app名称/model名称/ID值/change/
    /admin/app名称/model名称/ID值/delete/

   4、进入admin后台配置页面

  

    注释:后台显示一张userinfo表中的所有数据之所以显示的是UserInfo object是因为后台取的是一条记录的所有数据信息,即一条记录就是一个对象。如果通过value方式取数据得到的是列表内套字典,如果通过value_list取数据得到的是一个元组,所有大胆猜测后台是通过.all的方法将每一条记录数据全部取出来,所有得到的是个对象。

    5、models.py中的__str__方法

class UserInfo(models.Model):
name=models.CharField(max_length=32)
email=models.EmailField(max_length=32)
def __str__(self):
return self.name
注释:该方法的作用就是在后台管理页面自己定义需要显示的文字,但是只能显示记录中的某一个字段,尽管可以通过字符串拼接但是太娄比。

二、自己定制admin方法

  1、注册Mode中的类

    方式一:直接注册

from django.contrib import admin
from . import models
class zhangsan(admin.ModelAdmin):
list_display = ['name','xxx']
def xxx(self,obj):
return 'xxx'
admin.site.register(models.GroupInfo) # 第一个参数可以是列表
admin.site.register(models.UserInfo,zhangsan)
注释:必须先创建一个类然后注册model.py中类的时候写入之前注册的类

    方式二:通过装饰器注册

from django.contrib import admin
from . import models
@admin.register(models.UserInfo) # 第一个参数可以是列表
class UserAdmin(admin.ModelAdmin):
list_display = ('name', 'email','xx')
def xx(self,obj):
return 'aaaaaaaa'
注释:装饰器的作用就想当是注册了类,所以省略了注册类这一步

  2、ModelAdmin中可定制功能的方法

    1、list_display,在列表中,定制需要显示的字段(如果需要显示的字段在表记录中没有,就需要自己构造个函数,如下图所示,xxx为函数名,obj是该条记录对象)

from django.contrib import admin
from . import models
class zhangsan(admin.ModelAdmin):
list_display = ['name','xxx']
def xxx(self,obj):
return 'xxx'
admin.site.register(models.GroupInfo)
admin.site.register(models.UserInfo,zhangsan)

    2、list_display_links,在列表中,定制字段可以点击跳转(可以跳转至任意位置)

from django.contrib import admin
from . import models
from django.utils.safestring import mark_safe
class zhangsan(admin.ModelAdmin):
list_display = ['name','email','xxx']
list_display_links = ['name','email','xxx']
def xxx(self,obj):
tpl='<a href="http://www.baidu.com">%s</a>'%obj.name
return mark_safe(tpl) admin.site.register(models.UserInfo,zhangsan)

    3、list_filter,在列表中,定制右侧快速筛选。

  方式1:

from django.contrib import admin
from . import models
from django.utils.safestring import mark_safe
class zhangsan(admin.ModelAdmin):
list_display = ['name','email','xxx']
list_display_links = ['name','email','xxx']
list_filter = ['name']
def xxx(self,obj):
tpl='<a href="http://www.baidu.com">%s</a>'%obj.name
return mark_safe(tpl)
admin.site.register(models.UserInfo,zhangsan)

   方式2:修改右侧窗口显示

from django.contrib import admin
from . import models
from django.utils.translation import ugettext_lazy as _
class zhangsan(admin.ModelAdmin):
list_display = ('name', 'email')
class Ugg(admin.SimpleListFilter):
title = _('组名')
parameter_name = 'xxxxxx'
def lookups(self,request,model_admin):
# 显示右侧需要查看的列
return models.UserInfo.objects.values_list('name','id')
def queryset(self, request, queryset):
# queryset指代的是每一条记录对象
        
return queryset
# return queryset.filter(name='张三')
list_filter = ('name', Ugg,'email')
admin.site.register(models.UserInfo,zhangsan)

    4、list_select_related,在列表中,连表查询是否自动select_related

      格式:list_select_related=["外键字段名"]

    5、分页相关

# 分页,每页显示条数
list_per_page = 100
# 分页,显示全部(真实数据<该值时,才会有显示全部)
list_max_show_all = 200
# 分页插件
paginator = Paginator

    6、list_editable,在列表中,显示可以编辑的字段

      格式:list_editable=["字段名"]

    7、search_fields,在列表中,设置可以进行模糊搜索功能的字段

      格式:search_fields=["字段名"]

    8、date_hierarchy,在列表中,对Date和DateTime类型进行搜索

      格式:date_hierarchy = '字段名'               

       eg:在model中设置 ctime = models.DateTimeField(null=True, blank=True)

        在admin中设置 date_hierarchy = 'ctime

    9、preserve_filters,详细页面,删除、修改,更新后跳转回列表后,是否保留原搜索条件,默认是保存状态

      格式:preserve_filters = True

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

      格式:save_as = False

    11、save_as_continue ,点击保存并继续编辑默认为True

      格式:save_as_continue = True

save_as_continue = True
# 如果 save_as=True,save_as_continue = True, 点击Sava as new 按钮后继续编辑。
# 如果 save_as=True,save_as_continue = False,点击Sava as new 按钮后返回列表。

    12、save_on_top ,详细页面,在页面上方是否也显示保存删除等按钮,默认为False

      格式:save_on_top = False

    13、 inlines,详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除,切记是在非主键表中写 inlines。

      举例:用户表和用户组表是多对一关系,主键写在用户表中,就可以给用户组表写上inlines,然后就可以在用户组表中动态添加和删除用户。

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

    14、action,在列表中,定制action中的操作,就是具体的增删改查操作

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin): # 定制Action行为具体方法
def func(self, request, queryset):
print(self, request, queryset)
print(request.POST.getlist('_selected_action')) 获取到id列表 func.short_description = "中文显示自定义Actions"
actions = [func, ] # Action选项都是在页面上方显示
actions_on_top = True
# Action选项都是在页面下方显示
actions_on_bottom = False # 是否显示选择个数
actions_selection_counter = True

    15、定制HTML模板

add_form_template = None
change_form_template = None
change_list_template = None #为None表示默认admin后台使用的是django提供的默认模版,如果写为change_list_template = ['模板路径']则admin后台使用我们自定义的模板
delete_confirmation_template = None
delete_selected_confirmation_template = None
object_history_template = None

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

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

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

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

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

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

    19、readonly_fields,详细页面时,只读字段

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

    20、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'),
}),
)

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

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

    22、ordering,列表时,数据排序规则

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

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

    23、view_on_site,编辑时,是否在页面上显示view on set

view_on_site = False

def view_on_site(self, obj):
return 'https://www.baidu.com'

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

  

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

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

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
# show_full_result_count = True # 1 result (12 total)
# show_full_result_count = False # 1 result (Show all)
search_fields = ('user',)

    26、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': '40', 'rows': '10'}
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},
}

    27、prepopulated_fields = {},添加页面,当在某字段填入值后,自动会将值填充到指定字段。

  

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin): prepopulated_fields = {"email": ("user","pwd",)} PS: DjangoAdmin中使用js实现功能,页面email字段的值会在输入:user、pwd时自动填充

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

from app01 import models
from django.forms import ModelForm
from django.forms import fields class MyForm(ModelForm):
others = fields.CharField() class Meta:
model = models = models.UserInfo
fields = "__all__" @admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin): form = MyForm

    29、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 = "指定列数据为空时,默认显示"

总结:

  (都需要创建类,都需要继承父类admin.ModelAdmin,都需要在类中写一个可迭代序列)

  (总注册类时默认admin_class=None,默认使用admin.ModelAdmin内的方法,如果需要自定制功能就需要继承admin.ModelAdmin类)

django中的django admin插件的更多相关文章

  1. django中嵌入百度editor插件

    一.安装和配置步骤: 1.先下载百度ueditor插件,并安装pip install DjangoUeditor 2.把下载好的ueditor插件放到自己的项目中 3.配置setting INSTAL ...

  2. Django中 from django.utils import timezone 和import datetime的区别

    在现实环境中,存在多个时区,用户之间很有可能存在于不同的时区,并且许多国家都拥有自己的一套夏令时系统,所以如果网站面向的是多个时区用户,只以当前时间为标准开发,便会在时间上产生错误. 为解决这个此类问 ...

  3. Django中的Cookie、Session、Token

    Cookie : 指望着为了辨别用户身份.进行会话跟踪而存储在用户本地的数据(通常经过加密),是由服务端生成,发送给客户端浏览器,浏览器会将Cookie以key/value保存,下一请求同一网站是就发 ...

  4. Django 中自定义用户模型及集成认证授权功能总结

    1. 概述 Django 中的 django.contrib.auth 应用提供了完整的用户及认证授权功能. Django 官方推荐基于内置 User 数据模型创建新的自定义用户模型,方便添加 bir ...

  5. Django中配置用Redis做缓存和session

    django-redis文档: http://django-redis-chs.readthedocs.io/zh_CN/latest/# 一.在Django中配置 # Django的缓存配置 CAC ...

  6. Django中Admin样式定制

    Django自带的admin在展示数据是样式有点单一,我们可以自己定义数据的展示样式. 一.自定义数据展示样式 1.后台查询书记列表时,同时列出出版社和出版时间: admin.py文件 from dj ...

  7. django中admin的使用

    转载网址:https://www.cnblogs.com/wumingxiaoyao/p/6928297.html     Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理 ...

  8. Django中的admin组件分析

    admin的使用介绍 django-admin的使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.可以在项目的 setting ...

  9. Django 中 admin 的执行流程

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

随机推荐

  1. Atitit.创建快捷方式 windows快捷方式的原理

    Atitit.创建快捷方式 windows快捷方式的原理 1. Windows中有2种快捷方式的文件:1 2. Jshortcut2 2.1. 提示新不上jshortcut.dll2 2.2. 使用w ...

  2. Atitit.获取swing ui 按钮控件的id 与名字 与JPDA 调试体系

    Atitit.获取swing ui 按钮控件的id 与名字 与JPDA 调试体系 1. Swing Inspector是一个Java Swing/AWT用户界面分析和调试工具,功能与firebug类似 ...

  3. 【Java集合源代码剖析】Java集合框架

    转载轻注明出处:http://blog.csdn.net/ns_code/article/details/35564663 Java集合工具包位于Java.util包下,包括了非常多经常使用的数据结构 ...

  4. java 中 HashMap 遍历与删除

    HashMap的遍历 方法一.这是最常见的并且在大多数情况下也是最可取的遍历方式 /** * 在键值都需要时使用 */ Map<Integer, Integer> map = new Ha ...

  5. python 分支结构

    if 语句 if语句 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,可以用if语句实现: age = 20 if ag ...

  6. JS方法代理

    作者:Jiang, Jilin JS作为一门脚本语言.十分easy上手.外加其灵活性,能够轻而易举地扩展功能.今天,我们就聊聊JS的方法代理. 方法代理是脚本语言中常见的方法扩展形式.这样的灵活的形式 ...

  7. VMware虚拟机 Ubuntu 实用技巧 (1) -- 安装VMware Tool

    1.用VM安装Ubuntu后屏幕太小? 2.Ubuntu中的文本与window中的文本不能互相复制黏贴? 如果你遇到以上问题,可以通过在VMware里安装“VMware Tool”插件解决!! 安装步 ...

  8. Lumen migration(数据库协同)

    建立迁移文件/新建表文件 php artisan make:migration create_users_table 添加字段 php artisan make:migration add_colum ...

  9. Android错误——基础篇

    1. Android工程在真机上运行调试: 花了二个小时的时间来把App热部署到小米机上,简直让我寒透了心, 原本是按照网上提供的步骤一步步的做着,没想到小米神机居然出的是什么内测小米助手,两个窗口来 ...

  10. Android无线测试之—UiAutomator UiSelector API介绍之六

    对象搜索—类名与包名 一.类名属性定位对象 返回值 API 描述 UiSelector calssName(String className) 完整类名匹配 UiSelector calssNameM ...