Django Admin管理后台详解1(转)

转自:https://mp.weixin.qq.com/s?__biz=MjM5OTMyODA4Nw==&mid=2247484126&idx=1&sn=db9e171b03c52aa6bad941ce84caf39c&chksm=a73c62e6904bebf0aac2fd0f994bd5fc19b563a3e9dc1b9774b5b8bd2dd36d655aebda11a496&cur_album_id=1351340083605061635&scene=190#rd

原博客博大精深,光django基础就有40篇,我担心哪一天想看的时候看不了了,所有才转载几篇,想看的还请移步原作者的链接。

不得不说,django是python wen框架中的战斗机,那么我认为django admin绝对是这架战斗机的“发动机”,可以让你短短几个小时就开发一共功能强大的网站。

为什么要使用Django Admin

 

使用Django Admin可以快速对数据库的各个数据表进行增删查改。一行代码即可增加对一个模型(数据表)的增删查改。试想如果你要自己手动编写后台对一个模型进行增删查改,你一般需要4个urls, 4个视图函数或通用视图和4个模板。当一个项目比较大包含多个app时,而每个app又包含多个模型(数据表)时, 那么编写和维护整个项目管理后台的工作量可想而知。Django Admin所做就是将所有需要管理的模型(数据表)集中在一个平台,你不仅可以选择性地管理模型(数据表), 你还可以快速订制数据条目查询,过滤和搜索条件。

创建超级用户superuser

使用django admin的第一步是创建超级用户(superuser)。进入你的项目文件夹, 使用如下命名,输入用户名和密码即可创建管理员。

$ python manage.py createsuperuser 

此时你访问http://127.0.0.1:8000/admin/, 你就可以看到登录界面

注册模型(数据表)

假设你有一个叫blog的APP, 里面包含了一个叫Article(文章)的模型, 你想对文章进行管理, 你只需找到blgo的admin.py,使用admin.site.register方法注册Article模型。代码如下所示:

#blog/admin.py

from django.contrib import admin
from .models import Article

# Register your models here.
admin.site.register(Article)

此时你登录后看到Article数据表默认是这样的,点击标题即可对文章进行修改。只有Title字段被显示,太简单。没有显示作者,没有显示发布日期,也没有分页,没有过滤条件。

 

自定义数据表显示选项

我们需要自定义数据表中哪些字段可以显示,哪些字段可以编辑,并对数据表中的条目进行排序,同时定义过滤选项。Django的ModelAdmin自带的list_display, list_filter, list_per_page, list_editable, date_hierarchy和ordering选项可以轻松帮我们做到。

要自定义数据表显示字段,我们只需对上述代码做出如下改进。我们先定义ArticleAdmin类,然后使用admin.site.register(Article, ArticleAdmin)方法即可。

#blog/admin.py

from django.contrib import admin
from .models import Article, 

# Register your models here.


class ArticleAdmin(admin.ModelAdmin):

    '''设置列表可显示的字段'''
    list_display = ('title', 'author',  'status', 'mod_date',)

    '''设置过滤选项'''
    list_filter = ('status', 'pub_date', )

    '''每页显示条目数'''
    list_per_page = 5

    '''设置可编辑字段'''
    list_editable = ('status',)

    '''按日期月份筛选'''
    date_hierarchy = 'pub_date'

    '''按发布日期排序'''
    ordering = ('-mod_date',)

admin.site.register(Article, ArticleAdmin)

新的展示效果如下,是不是好多了? 试想下, 如果你要手动编写代码实现同样的功能,你需要多编写多少代码?

另外两个常用选项是 list_display_links和search_fields。前者设置带链接的字段,比如本例中带链接的字段为('title'), 后期设置可以搜索的字段,如('title', 'body'),方便快速查询需要修改的数据表条目。注意: list_display不能用在多对多字段上哦。

单对多关系的选择之raw_id_fields选项

 

假设我们有一个Category模型如下所示, 其有一个父类(ForeignKey),因为一个父类可能有多个子类。

class Category(models.Model):
    """文章分类"""
    name = models.CharField('分类名', max_length=30, unique=True)
    slug = models.SlugField('slug', max_length=40)
    parent_category = models.ForeignKey('self', verbose_name="父级分类", blank=True, null=True, on_delete=models.CASCADE)

我们现在把Category模型添加如admin,由于我们需要根据类别名(name)生成slug,我们所以还使用了prepopulated_fields选项。

#blog/admin.py

class CategoryAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('name',)}

admin.site.register(Category, CategoryAdmin)

效果图如下左图所示。由于Django admin默认的单对多关系的选择器是下拉菜单,假设ForeignKey非常的多,那么下拉菜单将非常长,不便于用户选择。一个更好的方法是对ForeignKey使用raw_id_fields选项(如右图所示)。

图片

改进过的代码如下所示,我们将看到下来菜单变成了放大镜。

class CategoryAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('name',)}
    raw_id_fields = ("parent_category", )

admin.site.register(Category, CategoryAdmin)

多对多关系的选择之filter_horizontal选项

由于Django admin默认的多对多关系(ManyToMany)选择器是复选框,非常的不好用。一个更好的方法是使用filter_horizontal或filter_vertical选项,如下图所示:

图片

 

显示多个数据表数据在同一页面上之InlineModelAdmin类

一个类别包含多篇文章,假设我们希望在查看编辑某个类别信息时,一同显示并编辑同属该类别下的所有文章信息,我们可以定义先定义ArticleInline类,然后把其附在CategoryAdmin里。这样我们就可以实现在同一页面上编辑类别和所属文章信息了,是不是很帅?

#blog/admin.py

from django.contrib import admin
from .models import Article, Category, Tag

class ArticleInline(admin.TabularInline):
    model = Article
    '''设置列表可显示的字段'''
    fields = ('title', 'author',  'status', 'mod_date',)


class CategoryAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('name',)}
    raw_id_fields = ("parent_category", )
    inlines = [ArticleInline, ]

admin.site.register(Category, CategoryAdmin)

展示效果如下所示。试想下,你想手动编写同样代码又要花多长时间?估计使用Mixins和Formsets早就让你心烦意乱了吧。

Django提供了两个InlineModelAdmin的子类:TabularInline和StackedInline,区别在于使用的模板, 一个横着,一个竖着,选项是一样的。InlineModelAdmin和ModelAdmin共同的常用options有:

form
fieldsets
fields
exclude
filter_horizontal
filter_vertical
ordering
prepopulated_fields
get_queryset()
radio_fields
readonly_fields
raw_id_fields

额外增加的options有:

InlineModelAdmin.model
inline使用的model,必需。

InlineModelAdmin.fk_name
model的name,当有多个外键时使用。

InlineModelAdmin.formset
缺省BaseInlineFormSet。

InlineModelAdmin.form
缺省ModelForm。当创建formset时传递给inlineformset_factory()。

InlineModelAdmin.extra
inline的额外数目。

InlineModelAdmin.get_extra()也返回inline的额外数目。

InlineModelAdmin.max_num
可展示得最大数目。

InlineModelAdmin.get_max_num()也返回此数字。

InlineModelAdmin.min_num
可展示的最小数目。

InlineModelAdmin.get_min_num()也返回此数目。

InlineModelAdmin.raw_id_fields

使用InlineModelAdmin一定要注意以下几点哦。

  • InlineModelAdmin不支持使用list_display选项,而要使用fileds或exclude选项来设置所数据表需要显示的字段。

  • 当一个model有多个ForeignKey时,必需使用fk_name来设置主键。


修改Admin的标题Title(标题)和Header(头部)

你是否早已厌倦了Django Admin模板里的Django Administration这句话? 要修改这句话也非常简单,在你的blog/admin.py里加入下面两句话即可,无需修改什么模板。

#blog/admin.py


admin.site.site_header = 'Blog Administration'

展示效果如下:

小结

本文详细总结了如何使用Django自带的admin快速开发管理后台,设置数据表显示选项,如何处理单对多和多对多关系的选择, 如何在同一页面上显示多个数据表,以及修改admin的标题。下文我们将介绍admin后台save方法的重写及其它高级知识,欢迎关注我们的微信。

原文地址:https://www.cnblogs.com/wangbin2188/p/15560897.html