Django之admin解析

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参数的名字,比如查询分类id1的内容时,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", )

你可能感兴趣的:(django学习)