Django学习笔记:Admin

2018-12-24  本文已影响0人  Py_Bird

Admin基础

admin后台本质上是Django给我们提供的一个app。

环境配置

admin依赖以下四个模块,请确保它们存在于INSTALLED_APPS中:

django.contrib.auth

django.contrib.contenttypes

django.contrib.messages

django.contrib.sessions

并且要将django.contrib.admin加入到INSTALLED_APPS列表。

创建超级用户

python manage.py createsuperuser

要修改管理员的路由,安全起见,不能用默认的admin/路径。

修改超级用户密码

python manage.py shell

from django.contrib.auth.models import User

user = User.objects.get(username=’<用户名>’)

user.set_password(‘<新密码>’)

user.save()

python manage.py changepassword <用户名>

#修改指定的用户的密码(提供用户名)或修改当前系统用户密码(不提供用户名)

访问Admin界面

http://localhost:8000/admin/

注册数据表

在admin.py中:

admin.site.register(<表>)     #一次只能注册一个类

ModelAdmin类

对于每个模型,可创建一个对应的ModelAdmin类,这个类的属性就是模型的所有自定义设置。

class <类名>Admin(admin.ModelAdmin):

    #设置ModelAdmin属性...

admin.site.register(<表>, <表>Admin)        #将数据表和它的ModelAdmin类绑定注册

@admin.register(<表>):                      #第二种方法,装饰器注册

class <表>Admin(admin.ModelAdmin):

    #设置ModelAdmin属性...

ModelAdmin的属性

list_display

在实例的修改界面横排显示指定的字段。

list_display = (‘<字段1>’, ‘<字段2>’, ...)

list_filter

在实例的列表界面显示一个FILTER右边栏,用指定的字段进行分类。

可分类的字段:BooleanField、CharField、DateField、DateTimeField、IntegerField、ForeignKey、ManyToManyField

list_filter = [‘<字段1>’, ‘<字段2>’, ...]

search_fields

在实例的列表界面添加搜索框,在指定字段的范围内搜索。

search_fields = [‘<字段1>’, ‘<字段2>’, ...]       #字段为CharField和TextField

actions

一个包含自定义行为的列表。

actions_on_top

默认为True,在页面的列表上方显示actions下拉框。

actions_on_bottom

默认为False,当为True时,在页面的列表下方显示actions下拉框。

actions_selection_counter

默认为True,在action下拉框右侧显示选中的对象数量。

date_hierarchy

指定一个日期型字段,为页面创建一个通过日期过滤对象的时间导航栏。

date_hierarchy = ‘date’

empty_value_display

设置类中的空值字段的默认显示内容(如None,空字符串等),默认是’-’。

empty_value_display = ‘-empty-’

可以设置全局的字段空值的默认显示内容:

admin.site.empty_value_display = ‘-empty-’     #这是一行新代码,并不在类中缩进!

exclude

对指定的字段排除显示。

exclude = ('<字段1>', ‘<字段2>’, ...)

fields

指定显示的字段,其顺序也是字段在Admin后台显示的顺序。

fields = ('<字段1>', ‘<字段2>’, ...)

可以组合元组,让几个字段在同一行显示,如:

fields = ( ('<字段1>', ‘<字段2>’), ‘<字段3>’, ...)

fieldsets

根据字段对页面进行分组显示,传入二元元组,其中每个元组代表一个分组。

fieldsets = (

    (‘<分组标题A>’, {                          # <分组标题>可用None表示无标题

        ‘fields’: (‘<字段1>’, ‘<字段2>’, ...)

        } ),

    (‘<分组标题B>’, {

        ‘fields’: (‘<字段3>’,)

    } ),

    ...

)

显示样式:

分组标题A

字段1

字段2

...

分组标题B

字段3

...

fields同样可以组合元组,让几个字段在同一行显示:

fields = ( ('<字段1>', ‘<字段2>’), ‘<字段3>’, ...)

跟’fields’同级别的属性:

‘classes’: (‘wide’, ‘collaspe’)

一个包含额外CSS类的元组,wide让分组具备更宽的水平空间,collaspe将整个分组折叠。

‘description’

一个可选的额外说明文本,放在每个分组的顶部,如果内部有HTML语法将不被转义。

filter_horizontal

将指定的多对多字段分成水平两部分显示(默认是一个选择框)。

filter_vertical

将指定的多对多字段分成垂直两部分显示(默认是一个选择框)。

form

编写自定义的ModelForm,用于添加/修改页面的表单。

list_editable

指定在修改页面中可以直接编辑的字段,指定的字段将显示为编辑框。

只能设置list_display中的字段。

list_max_show_all

指定一个数值,当列表元素总数大于该值时,显示为“show all”链接,默认为200。

list_per_page

设置每页显示的元素个数,默认为100。

list_select_related

使用select_related()方法查询数据,可以减少数据库访问,默认为False(只对ForeighKey字段调用),当为True时始终调用。

可以传入元组或列表,指定用select_related()查询的字段。

list_select_related = (‘<字段1>’, ‘<字段2>’, ...)

ordering

设置排序方式,传入元组或列表。

radio_fields

用选项展示ForeighKey字段。

save_as

默认为False,显示为“保存并添加另一个”按钮,当为True时变成“保存为新对象”按钮。

save_as_continue

默认为True,在保存新对象后跳转到修改页面,当为False时,跳转到元素列表页面。

save_on_top

默认为False,当为True时,页面顶部会提供同样的一系列保存按钮。

show_full_result_count

默认为True,显示过滤后的对象的总数,如“99 results (143 total)”,对整个表进行count()操作,如果数据表很大,会耗费一定的资源;当为False时显示为“99 results (show all)“。

#将子表的数据放在主表数据中编辑,此时主表字段下面提供n组相关联的子表字段

class <子表名>InLine(admin.StackedInLine):   #可继承admin.TabularInLine进行扁平化显示

    model = <子表名>

    extra = <编辑的子表数>

class <主表名>Admin(admin.ModelAdmin):

    inlines = [<子表名>InLine]

自定义Admin首页

修改Admin页面顶端的显示文字:

在admin.py中:

django.contrib.admin.AdminSite.site_header = ‘xxx’

修改Admin首页模板:

写入”项目根目录/templates/admin/base_site.html“的模板,见templates笔记第1页。

自定义Admin的Action操作

Action操作用于修改大量的目标,可以编写action函数来自定义该操作。

①在ModelAdmin类中添加属性:

actions = [‘<函数名>’]               #将action函数预先添加到ModelAdmin中

②编写action函数

action函数必须携带三个参数:当前的ModelAdmin、request、被选择的QuerySet对象。

在ModelAdmin类中继续①的代码:

def <函数名>(self, request, queryset):      #用self访问ModelAdmin类本身

    for obj in queryset:

        #对Queryset进行修改...

    self.message_user(request, ‘xxxx’)     #为操作添加提示信息,xxxx显示为页面顶部绿色行

<函数名>.short_description = ‘xxx’      #对函数添加描述,显示为Action下拉列表中的名称,

下拉列表中默认显示为函数名

action函数的全站引用与禁用

admin.site.add_action(<函数名>)          #将action函数作用于整个admin站点

admin.site.disable_action(<函数名>)        #将action函数全站禁用

#全站禁用的action函数也可以添加到某个ModelAdmin类的action属性中,进行显式的引用

class <类名>Admin(admin.ModelAdmin):

    actions = None                      #禁用该模型中的所有action函数

上一篇下一篇

猜你喜欢

热点阅读