admin依赖
依赖APP:
django.contrib.admin
django.contrib.auth
django.contrib.contenttypesdjango.contrib.messagesdjango.contrib.sessionsINSTALLED_APPS
依赖模板的context_processors:
django.contrib.auth.context_processors.auth
django.contrib.messages.context_processors.messages
依赖的中间件:
django.contrib.auth.middleware.AuthenticationMiddleware
django.contrib.messages.middleware.MessageMiddleware
如何定义一个admin
@admin.register(Category) # 参数是你管理的哪一个表单
class CategoryAdmin(admin.ModelAdmin):
pass
基础的配置
1、list_display 用来配置列表页面展示哪些字段
list_display = ('title', 'category', 'status',
'created_time', 'owner', 'operator')
2、list_display_links 用来配置哪些字段可以作为链接,点击之后进入编辑页面
list_display_links = ('title', 'category')
3、list_filter 配置页面的过滤器,需要通过哪些字段来过滤列表页面
class CategoryOwnerFilter(admin.SimpleListFilter):
""" 自定义过滤器只显示当前用户分类 """
title = '分类过滤器'
parameter_name = 'owner_category'
def lookups(self, request, model_admin):
return Category.objects.filter(owner=request.user).values_list('id', 'name')
def queryset(self, request, queryset):
category_id = self.value()
if category_id:
return queryset.filter(category_id=self.value())
return queryset
@admin.register(Post, site=custom_site)
class PostAdmin(admin.ModelAdmin):
list_filter = (CategoryOwnerFilter, )
4、search_fields 配置搜索字段
search_fields = ('title', 'category__name')
5、actions 编辑页面上提供的的操作的列表
actions = () # 定制动作
actions_selection_counter = True # 是否显示选择计数器
actions_on_top = True # 动作相关的配置,是否展示在顶部
actions_on_bottom = True # 动作相关的配置,是否展示在底部
save_on_top = True # 保存、编辑、编辑并新建按钮是否在顶部展示
save_as_continue # 点击保存并继续编辑
6、fields # 编辑页面显示哪些字段并按顺序显示。如果要显示在同一行,就用一个元组将要在同一行显示的字段包装起来
fields = (
('category', 'title'),
'desc',
'status',
'content',
'tag',
)
exclude # 与fields相反,不显示哪些字段
7、fieldsets 用来控制页面布局,格式要求:有两个元素的元组的列表
fieldsets = (
('基础配置', {
'description': '基础配置描述',
'fields': (
('title', 'category'),
'status',
),
}),
('内容', {
'fields': (
'desc',
'content',
),
}),
('额外信息', {
'classes': ('collapse', ),
'fields': ('tag', ),
})
)
字典中的key可以为fields:与fields选项一样,要在同一行上显示多个字段,就用一个元组将
要在同一行显示的字段包装起来。
classes:给要配置的版块添加一些CSS属性
description:一组可选的额外文本,显示在每个字段集的顶部,位于字段集的标题下
8、字段展示设置
filter_horizontal = True # 设置哪些字段是横向展示,编辑页
filter_vertical = True # 设置哪些字段是纵向展示,编辑页
9、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 = "指定列数据为空时,默认显示"
10、inlines 如果有其他表和当前表做关联,那么详细页面可以进行动态增加和删除
class PostInline(admin.TabularInline): # 在分类页面可以编辑文章
fields = ('title', 'desc')
extra = 1
model = Post
@admin.register(Category, site=custom_site)
class CategoryAdmin(admin.ModelAdmin):
inlines = [PostInline, ]
11、form 用于定制用户请求时候表单验证
from django import forms
class PostAdminForm(forms.ModelForm):
desc = forms.CharField(widget=forms.Textarea, label="摘要", required=False)
@admin.register(Post, site=custom_site)
class PostAdmin(admin.ModelAdmin):
form = PostAdminForm
注:如果ModelForm和ModelAdmin两者都定义了一个exclude 选项,那么ModelAdmin优先
12、formfield_overrides 指定插件
from django.contrib import admin
from django.db import models
from myapp.models import MyModel
from myapp.widgets import RichTextEditorWidget
class MyModelAdmin(admin.ModelAdmin):
formfield_overrides = {
models.TextField: {'widget': RichTextEditorWidget},
}
13、short_description 给自定义列添加标题,使用方法见下面list_display自定义字段
14、admin_order_field 排序,需要在models中进行设置
from django.contrib import admin
from django.db import models
from django.utils.html import format_html
class Person(models.Model):
first_name = models.CharField(max_length=50)
color_code = models.CharField(max_length=6)
def colored_first_name(self):
return format_html(
'{}',
self.color_code,
self.first_name,
)
colored_first_name.admin_order_field = 'first_name'
# 降序在前面加个-
class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'colored_first_name')
15、
list_max_show_all # 设置显示的数量,仅当总数小于或等于此设置时,才会在列表中显示“全部显示”链接。
list_per_page # 每页显示的数量,默认100
list_select_related
paginator # 分页插件
16、ordering 设置根据哪个对象进行排序
17、radio_fields,对ForeignKey和choices设置或已设置的字段使用选择框界面,如果存在字段radio_fields,Django将使用单选按钮界面
class PersonAdmin(admin.ModelAdmin):
radio_fields = {"group": admin.VERTICAL}
18、raw_id_fields,将外键和Manytomany字段变成以Input框形式
class ArticleAdmin(admin.ModelAdmin):
raw_id_fields = ("newspaper",)
19、view_on_site 编辑时,是否在页面上显示view on set
20、show_full_result_count 是否在过滤的管理页面上显示过滤后的数量
21、sortable_by 禁止某些排序,若为空则禁止所有的排序
在list_display中自定义显示字段
自定义字段需要自定义函数,并在list_display中加入该字段
from django.urls import reverse
from django.utils.html import format_html
list_display = ('operator', )
def operator(self, obj):
return format_html(
'编辑',
reverse('admin:blog_post_change', args=(obj.id, ))
)
operator.short_description = '操作'
自定义函数可以返回HTML,但是需要通过format_html函数处理,reverse是根据名称解析出URL地址,short_description的作用是设定该字段展示的名称
自定义list_filter
通过继承admin中的SimoleListFilter来实现
class CategoryOwnerFilter(admin.SimpleListFilter):
""" 自定义过滤器只显示当前用户所创建的内容 """
title = '分类过滤器'
parameter_name = 'owner_categoey'
def lookups(self, request, model_admin):
return Category.objects.filter(owner=request.user).values_list('id',
'name')
def queryset(self, request, queryset):
category_id = self.value()
if category_id:
return queryset.filter(category_id=self.value())
return queryset
SimpleListFilter提供了两个属性和两个方法可供我们修改,title用于展示标题,
parameter_name时查询时URL参数的名字,比如查询分类id为1的内容时,URL后面的QUery
部分为?owner_category=1
lookups:返回要展示的内容和查询用的id
queryset:根据URL Query部分的内容返回列表页数据,比如?owner_category=1,
那么self.value()拿到的数据就为1
定义过后要把list_filter修改为 list_filter = (CategoryOwnerFilter, )。
自定义列表页数据
重写 get_queryset()方法
def get_queryset(self, request):
qs = super(PostAdmin, self).get_queryset(request)
return qs.filter(owner=request.user)
获取属于当前登陆的用户的数据
Media自定义静态资源引入
Media是Django提供的一个接口,可以用来配置项目的静态资源
class Media:
css = {
'all': ("https://cdn.bootcss.com/bootstrap/4.0.0-beta.2/css/bootsrap.min.css", ),
}
js = ("https://cdn.bootcss.com/bootstrap/4.0.0-beta.2/js/bootstrap.bundle.js", )