深入理解Django Admin的list_display, list_filter和raw_id_fields,filter_horizontal选项。

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

深入理解Django Admin的list_display, list_filter和raw_id_fields,filter_horizontal选项。_第1张图片

 

为什么要使用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)

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

深入理解Django Admin的list_display, list_filter和raw_id_fields,filter_horizontal选项。_第2张图片

另外两个常用选项是 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选项(如右图所示)。

深入理解Django Admin的list_display, list_filter和raw_id_fields,filter_horizontal选项。_第3张图片

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

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

深入理解Django Admin的list_display, list_filter和raw_id_fields,filter_horizontal选项。_第4张图片

你可能感兴趣的:(Django,django,list_display,list_filter,raw_id_fields)