对于习惯了自己动手编写后台的小编我而言,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)。进入你的项目文件夹, 使用如下命名,输入用户名和密码即可创建管理员。
$ 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选项,如下图所示:
大江狗
2018.10.29