zoukankan      html  css  js  c++  java
  • 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方法的重写及其它高级知识,欢迎关注我们的微信。

  • 相关阅读:
    【总结】我所整理的各种CSS居中
    【转】前端精选文摘:BFC 神奇背后的原理
    【转】CSS深入理解流体特性和BFC特性下多栏自适应布局
    【转】css学习专题-BFC
    【转】关于Block Formatting Context--BFC和IE的hasLayout
    【转】CSS z-index 属性的使用方法和层级树的概念
    IScroll5兼容IE修改
    IE 浏览器各个版本 JavaScript 支持情况一览表
    iOS UITextField输入框
    iOS判断当前设备旋转方向
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15560897.html
Copyright © 2011-2022 走看看