DjangoAdmin详解

当前在和model一起修改admin 样式如下

from django.contrib import admin

# Register your models here.
from .models import Article, Category


class CategoryAdmin(admin.ModelAdmin):
    fields = ('title', 'slug', 'description')
    list_display = ('title', 'slug')


class ArticleAdmin(admin.ModelAdmin):
    fields = ['title', 'description', 'content', 'status', 'header_image_url', 'header_image', 'categories']
    list_display = ('title', 'description', 'content', 'status', 'createdAt', 'updatedAt')
    list_filter = ['createdAt', 'updatedAt']
    search_fields = ['title', 'description']


admin.site.register(Article, ArticleAdmin)
admin.site.register(Category, CategoryAdmin)

通过 admin.site.register(Article, ArticleAdmin) 注册 Article 模型,Django 能够构建一个默认的表单用于展示。通常来说,你期望能自定义表单的外观和工作方式。你可以在注册模型时将这些设置告诉 Django。

默认配置样式如下

下面我们来一步一步优化样式

优化将field分为不同的区间来修改

对于拥有数十个字段的表单来说,为表单选择一个直观的排序方法就显得你的针很细了。

说到拥有数十个字段的表单,你可能更期望将表单分为几个字段集:

from django.contrib import admin

# Register your models here.
from .models import Article, Category


class CategoryAdmin(admin.ModelAdmin):
    fields = ('title', 'slug', 'description')
    list_display = ('title', 'slug')


class ArticleAdmin(admin.ModelAdmin):
    fieldsets = [
        ('basic content', {'fields': ['title', 'description', 'content', 'status']}),
        ('banner', {'fields': ['header_image_url', 'header_image']}),
        ('category', {'fields': ['categories',]}),
    ]
    list_display = ('title', 'description', 'content', 'status', 'createdAt', 'updatedAt')
    list_filter = ['createdAt', 'updatedAt']
    search_fields = ['title', 'description']

admin.site.register(Article, ArticleAdmin)
admin.site.register(Category, CategoryAdmin)

可以使用fieldsets将相同的部分分组整理起来,在输入的时候会更清楚

如图展示如下

多对多关系优化

这种模式的多对多关系看起来比较简单, 有时候比较难看清楚具体的选择情况,可以提供更方便的管理方式。

from django.contrib import admin

# Register your models here.
from .models import Article, Category


class CategoryAdmin(admin.ModelAdmin):
    fields = ('title', 'slug', 'description')
    list_display = ('title', 'slug')


class ArticleAdmin(admin.ModelAdmin):
    fieldsets = [
        ('basic content', {'fields': ['title', 'description', 'content', 'status']}),
        ('banner', {'fields': ['header_image_url', 'header_image']}),
        ('category', {'fields': ['categories',]}),
    ]
    list_display = ('title', 'description', 'content', 'status', 'createdAt', 'updatedAt')
    list_filter = ['createdAt', 'updatedAt']
    search_fields = ['title', 'description']
    filter_horizontal = ('categories',)


admin.site.register(Article, ArticleAdmin)
admin.site.register(Category, CategoryAdmin)

添加filter_horizontal可以优化具体的表现形式。

这种方式的显示会直观很多。

list_display

list_display用来展示列表页面内容

同时list_display可以包含Model的相关方法来获取更加丰富的展示。详情可以参考django文档

list_filter

list_filter负责配置右侧的过滤组件。

    list_filter = ['categories','createdAt', 'updatedAt']

显示结果

search_filter

在列表的顶部增加一个搜索框。当输入待搜项时,Django 将搜索 question_text 字段。你可以使用任意多的字段——由于后台使用 LIKE 来查询数据,将待搜索的字段数限制为一个不会出问题大小,会便于数据库进行查询操作。

现在是给你的修改列表页增加分页功能的好时机。默认每页显示 100 项。变更页分页, 搜索框, 过滤器, 日期层次结构, 和 列标题排序 均以你期望的方式合作运行。

    search_fields = ['title', 'description']

修改admin list默认绑定事件

我们在Article中做了软删除,并修改了delete事件,所以当我们在admin中删除一个Article的时候,还能看到这个Article在列表页面中。这时需要在admin的列表页面返回的时候,删掉哪些deletedAt字段不为NULL的项,保证不看到已经删除的内容。

admin支持重写默认的get_queryset方法,来修改列表里面内容,所以我们可以按照如下的方法来修改deletedAt事件

修改admin.py

class ArticleAdmin(admin.ModelAdmin):
    fieldsets = [
        ('basic content', {'fields': ['title', 'description', 'content', 'status']}),
        ('banner', {'fields': ['header_image_url', 'header_image']}),
        ('category', {'fields': ['categories', ]}),
    ]
    list_display = ('title', 'description', 'content', 'status', 'createdAt', 'updatedAt')
    list_filter = ['categories', 'createdAt', 'updatedAt']
    search_fields = ['title', 'description']
    filter_horizontal = ('categories',)

    def get_queryset(self, request):
        qs = super(ArticleAdmin, self).get_queryset(request)
        qs = qs.filter(deletedAt=None)
        return qs

所以重写get_queryset方法,并过滤掉其中的deletedAt方法就可以获得想要的返回值。 这时可以在admin页面中去查看,删除的部分是否已经没有了

可参考文档 django-admin文档

Last updated

Was this helpful?