Django内置Admin

Stella981
• 阅读 501

Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有:

Django内置Admin Django内置Admin

    依赖APP:
        django.contrib.auth
        django.contrib.contenttypes
        django.contrib.messages
        django.contrib.sessions

    模板的context_processors:
        django.contrib.auth.context_processors.auth
        django.contrib.messages.context_processors.messages

    中间件:
        django.contrib.auth.middleware.AuthenticationMiddleware 
        django.contrib.messages.middleware.MessageMiddleware

Django Admin内部依赖

一. 配置路由

?

1

2

3

urlpatterns = [

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

]

当前配置的路由可以创建一些路由映射关系:

/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/

二. 定制Admin

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

?

1

admin.site.register(models.UserInfo)

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

?

1

2

3

4

5

6

7

8

9

10

11

方式一:

class UserAdmin(admin.ModelAdmin):

list_display = ( 'user' , 'pwd' ,)

admin.site.register(models.UserInfo, UserAdmin) # 第一个参数可以是列表

方式二:

@admin .register(models.UserInfo) # 第一个参数可以是列表

class UserAdmin(admin.ModelAdmin):

list_display = ( 'user' , 'pwd' ,)

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

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

?

1

2

3

4

5

6

@admin .register(models.UserInfo)

class UserAdmin(admin.ModelAdmin):

list_display = ( 'user' , 'pwd' , 'xxxxx' )

def xxxxx( self , obj):

return "xxxxx"

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

?

1

2

3

4

@admin .register(models.UserInfo)

class UserAdmin(admin.ModelAdmin):

list_display = ( 'user' , 'pwd' , 'xxxxx' )

list_display_links = ( 'pwd' ,)

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

from django.utils.translation import ugettext_lazy as _

@admin .register(models.UserInfo)

class UserAdmin(admin.ModelAdmin):

list_display = ( 'user' , 'pwd' )

class Ugg(admin.SimpleListFilter):

title = _( 'decade born' )

parameter_name = 'xxxxxx'

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):

"""

点击查询时,进行筛选

:param request:

:param queryset:

:return:

"""

v = self .value()

return queryset. filter (ug = v)

list_filter = ( 'user' ,Ugg,)

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

5. 分页相关

?

1

2

3

4

5

6

7

8

# 分页,每页显示条数

list_per_page = 100

# 分页,显示全部(真实数据<该值时,才会有显示全部)

list_max_show_all = 200

# 分页插件

paginator = Paginator

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

?

1

2

3

4

@admin .register(models.UserInfo)

class UserAdmin(admin.ModelAdmin):

list_display = ( 'user' , 'pwd' , 'ug' ,)

list_editable = ( 'ug' ,)

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

?

1

2

3

4

@admin .register(models.UserInfo)

class UserAdmin(admin.ModelAdmin):

search_fields = ( 'user' , 'pwd' )

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

?

1

2

3

4

@admin .register(models.UserInfo)

class UserAdmin(admin.ModelAdmin):

date_hierarchy = 'ctime'

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

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

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

?

1

2

3

4

5

6

save_as_continue = True

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

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

New in Django 1.10 .

12. save_on_top = False,详细页面,在页面上方是否也显示保存删除等按钮

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

?

1

2

3

4

5

6

7

8

class UserInfoInline(admin.StackedInline): # TabularInline

extra = 0

model = models.UserInfo

class GroupAdminMode(admin.ModelAdmin):

list_display = ( 'id' , 'title' ,)

inlines = [UserInfoInline, ]

14. action,列表时,定制action中的操作

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

@admin .register(models.UserInfo)

class UserAdmin(admin.ModelAdmin):

# 定制Action行为具体方法

def func( self , request, queryset):

print ( self , request, queryset)

print (request.POST.getlist( '_selected_action' ))

func.short_description = "中文显示自定义Actions"

actions = [func, ]

# Action选项都是在页面上方显示

actions_on_top = True

# Action选项都是在页面下方显示

actions_on_bottom = False

# 是否显示选择个数

actions_selection_counter = True

15. 定制HTML模板

?

1

2

3

4

5

6

add_form_template = None

change_form_template = None

change_list_template = None

delete_confirmation_template = None

delete_selected_confirmation_template = None

object_history_template = None

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

?

1

2

3

4

@admin .register(models.UserInfo)

class UserAdmin(admin.ModelAdmin):

raw_id_fields = ( 'FK字段' , 'M2M字段' ,)

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

?

1

2

3

@admin .register(models.UserInfo)

class UserAdmin(admin.ModelAdmin):

fields = ( 'user' ,)

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

?

1

2

3

@admin .register(models.UserInfo)

class UserAdmin(admin.ModelAdmin):

exclude = ( 'user' ,)

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

?

1

2

3

@admin .register(models.UserInfo)

class UserAdmin(admin.ModelAdmin):

readonly_fields = ( 'user' ,)

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

?

1

2

3

4

5

6

7

8

9

10

11

@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显示时,数据移动选择(方向:上下和左右)

?

1

2

3

@admin .register(models.UserInfo)

class UserAdmin(admin.ModelAdmin):

filter_vertical = ( "m2m字段" ,) # 或filter_horizontal = ("m2m字段",)

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

?

1

2

3

4

5

6

@admin .register(models.UserInfo)

class UserAdmin(admin.ModelAdmin):

ordering = ( '-id' ,)

def get_ordering( self , request):

return [ '-id' , ]

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

?

1

2

3

4

view_on_site = False

def view_on_site( self , obj):

return 'https://www.baidu.com'

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

?

1

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

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

?

1

2

3

4

5

@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 = {},详细页面时,指定现实插件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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 = {},添加页面,当在某字段填入值后,自动会将值填充到指定字段。

?

1

2

3

4

@admin .register(models.UserInfo)

class UserAdmin(admin.ModelAdmin):

prepopulated_fields = { "email" : ( "user" , "pwd" ,)}

PS: DjangoAdmin中使用js实现功能,页面email字段的值会在输入:user、pwd时自动填充

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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

?

1

2

3

4

5

6

7

8

9

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这