Django基础:Django Admin管理后台详解(上)

对于习惯了自己动手编写后台的小编我而言,Django自带的admin管理后台就像诸葛亮的媳妇黄月英,拥有和诸葛亮一样的才华,啥都行,只是不漂亮。小编我一开始对django自带的admin其实内心是拒绝的,所以一直拖到今天才写专文介绍Django的admin。在今天来看,这是小编我本不该犯的错误,所以也建议大家千万不要拒绝使用Django的admin,而是应该学习更好地使用django的admin。Django自带的admin是快速开发管理后台的一把利剑,可以大大加快开发速度,也是Django的一个主要优点。今天我们就来看看Django admin的强大之处以及如何配置使用它。

为什么要使用Django Admin

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

创建超级用户superuser

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

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

注册模型(数据表)

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

#blog/admin.py

自定义数据表显示选项

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

#blog/admin.py

fromdjango.contribimportadmin

from.modelsimportArticle,

# Register your models here.

classArticleAdmin(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),因为一个父类可能有多个子类。

classCategory(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

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

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

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

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

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

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

#blog/admin.py

fromdjango.contribimportadmin

from.modelsimportArticle,Category,Tag

classArticleInline(admin.TabularInline):

model = Article

'''设置列表可显示的字段'''

fields = ('title','author','status','mod_date',)

classCategoryAdmin(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

展示效果如下:

小结

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

大江狗

2018.10.29

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181029G1LEHL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券