后台管理

一个网站分为前台(普通用户访问)和管理后台(由网站管理员访问)两部分

管理后台由网站的管理员负责查看、添加、修改、删除数据,开发这些重复的功能是一件单调乏味、缺乏创造力的工作,为此,Django能够根据定义的模型类自动地生成管理模块 使用Django的管理模块,需要按照如下步骤操作

  1. 管理界面本地化
  2. 创建管理员
  3. 注册模型类
  4. 自定义管理页面

操作演示:

1)本地化 (语言和时区)

修改settings.py文件。

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'    # 指定语言(注意不要写错,否则无法启动服务器)

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'  # 指定时间

2)创建登录后台的管理员

python3 manage.py createsuperuser

需要指定: 用户名,邮箱,密码

3)注册模型类

在应用下的admin.py中注册模型类:告诉djang框架,根据注册的模型类来生成对应表管理页面:

# app01/admin.py:
from app01.models import Department, Employee

# 注册Model类
admin.site.register(Department)
admin.site.register(Employee)

4) 启动服务器:

python manage.py runserver

在浏览器上输入以下地址,进入管理后台,对数据库表数据进行管理:

http://127.0.0.1:8000/admin

5)自定义数据模型显示哪些字段信息

自定义模型管理类,作用:告诉django在生成的管理页面上显示哪些内容。

# app01/admin.py:
class DepartmentAdmin(admin.ModelAdmin):
    # 指定后台网页要显示的字段
    list_display = ["id", "name", "create_date"]


class EmployeeAdmin(admin.ModelAdmin):
    # 指定后台网页要显示的字段
    list_display = ["id", "name", "age", "sex", "comment"]


# 注册Model类
admin.site.register(Department, DepartmentAdmin)

admin.site.register(Employee, EmployeeAdmin)

Admin站点

内容发布的部分由网站的管理员负责查看、添加、修改、删除数据,开发这些重复的功能是一件单调乏味、缺乏创造力的工作,为此,Django能够根据定义的模型类自动地生成管理模块,在Django项目中默认启用Admin管理站点。

后台管理准备工作

  1. 数据库配置:

    • 配置数据库
    • mysql中创建数据库:db_django05
    • 在项目的__init__文件中import pymysql包
  2. 模型操作

    • 创建Area区域模型类;

      class Area(models.Model):
          """地区类"""
          title = models.CharField(max_length=50)
          # 外键: 自关联
          parent = models.ForeignKey('self', null=True, blank=True)
      
    • 生成迁移文件,再作迁移生成数据库表;

    • 插入测试数据: source area.sql (资料中提供)
  3. admin后台管理操作

    1. 创建后台管理器账号

      python manage.py createsuperuser
      

      按提示填写用户名、邮箱、密码,确认密码。

    2. 注册模型类: 要在后台要能看到模型类表,需要在admin.py中注册模型类

      from django.contrib import admin
      from models import *
      
      admin.site.register(Area)
      
    3. 登录到后台: 通过http://127.0.0.1:8000/admin/访问服务器: 输入刚创建的用户名和密码,登录到后台管理界面,登录成功可以看到如下,可以对Area进行增加、修改、删除、查询的管理操作:

列表页选项

类ModelAdmin可以控制模型在Admin界面中的展示方式,主要包括在列表页的展示方式、添加修改页的展示方式。

在app01/admin.py中,注册模型类前定义管理类AreaAdmin

class AreaAdmin(admin.ModelAdmin):
    pass

打开app01/admin.py文件,注册模型类代码如下

admin.site.register(AreaInfo, AreaAdmin)

接下来介绍如何控制列表页、增加修改页展示效果

  1. 每页显示多少条

    打开booktest/admin.py文件,修改AreaAdmin类如下:

    class AreaAdmin(admin.ModelAdmin):
        list_per_page = 10  # 默认为100条
    

    在浏览器中查看区域信息的列表页面,效果如下图:

设置操作选项的位置

# app01/admin.py
class AreaAdmin(admin.ModelAdmin):
    ...
    # 显示顶部的选项
    actions_on_top = True
    # 显示底部的选项
    actions_on_bottom = True

在浏览器中刷新效果如下图:


列表中的列操作

  • 定义列表中要显示哪些字段

    # app01/admin.py
    class AreaAdmin(ModelAdmin):
    
        # 定义列表中要显示哪些字段
        list_display = ['id', 'title']

  • 点击列头可以进行升序或降序排列

  • 模型类中定义的方法也可以作为列显示(通过此方式可访问关联对象的属性)

    # models.py
    class Area(models.Model):
        """区域显示"""
        ...
    
        def parent_area(self):
            """返回父级区域名"""
            if self.parent is None:
                return ''
    
            return self.parent.title
    

    注册列:

    class AreaAdmin(ModelAdmin):
        ...
        # 定义列表中要显示哪些字段(也可以指定方法名)
        list_display = ['id', 'title', 'parent_area']
    


修改显示的列的名字

列标题默认为属性或方法的名称,可以通过属性设置。对于模型属性,通过verbose_name设置,对于方法,通过short_description设置,如下:

# models.py
class Area(models.Model):
    """区域显示"""

    # 设置verbose_name属性
    title = models.CharField(verbose_name='名称', max_length=30)  # 区域名

    def parent_area(self):
        """返回父级区域名"""
        if self.parent is None:
            return ''

        return self.parent.title

    # 指定方法列显示的名称
    parent_area.short_description = '父级区域'
  # 方法列默认不能排序,需要指定方法列按id进行排序
  parent_area.admin_order_field = 'id'

右侧栏过滤器

使用list_filter指定过滤,只能接收字段,会将对应字段的值列出来,用于快速过滤。一般用于有重复的字段。

# admin.py
class AreaAdmin(ModelAdmin):
    ...
    # 右侧栏过滤器
    list_filter = ['title']

刷新效果如下:

搜索框

使用search_fields属性, 对指定字段的值进行搜索,支持模糊查询

# admin.py
class AreaAdmin(ModelAdmin):
    ...

    # 要搜索的列的值 
    search_fields = ['title']

刷新效果如下:



编辑页选项

  1. 显示字段顺序

    # admin.py
    class AreaAdmin(ModelAdmin):
        ...
        # 表单中字段显示的顺序
        fields = ['parent', 'title']

修改对象显示的字符串: 重写__str__方法

# models.py
class Area(models.Model):
    """区域显示"""
    ... 
    # 重写方法
    def __str__(self):
        return self.title

刷新效果如下:


字段分组显示

格式如下:

fieldsets=(
    ('组1标题',{'fields':('字段1','字段2')}),
    ('组2标题',{'fields':('字段3','字段4')}),
)

注意:fieldsets和fields,只能使用其中的一个

代码:

# admin.py  
class AreaAdmin(ModelAdmin):
    ...
    # 字段分组显示
    fieldsets = (
        ('基本', {'fields': ('title',)}),
        ('高级', {'fields': ('parent',)}),
    )


编辑关联对象

  • 在一对多的关系中,可以在一端的编辑页面中编辑多端的对象,嵌入多端对象的方式包括表格、块两种
  • 类型InlineModelAdmin:表示在模型的编辑页面嵌入关联模型的编辑
  • 子类TabularInline:以表格的形式嵌入
  • 子类StackedInline:以块的形式嵌入

在app01/admin.py文件中添加如下代码:

class AreaStackedInline(admin.StackedInline):
    model = AreaInfo    # 关联子对象(多类对象)

class AreaAdmin(admin.ModelAdmin):
    ...
    inlines = [AreaStackedInline]

下面再来看下表格的效果:

class AreaTabularInline(TabularInline):
    model = Area   # 多类的名字
    ...

class AreaAdmin(admin.ModelAdmin):
    ...
    inlines = [AreaTabularInline]

刷新效果如下:

修改预留新增选项

class AreaTabularInline(TabularInline):
    ...
    extra = 2      # 额外预留新增选项默认为3个


重写后台管理模板

  1. 进入到django的admin应用的模板目录,如下:

    /home/python/.virtualenvs/py_django/lib/python2.7/site-packages/django/contrib/admin/templates/admin
    

    找到base-site.html文件,复制到当前项目的templates/admin目录下(admin目录需要自行创建出来)


修改base-site.html内容:

新增一行代码,如下图:


             刷新结果:


choices选项和富文本编辑器

一、choices选项使用

  1. 创建测试模型类

     # apps/user/models.py
     class TestModel(models.Model):
         """测试"""
    
         ORDER_STATUS_CHOICES = (
             (1, "待支付"),
             (2, "待发货"),
             (3, "待收货"),
             (4, "待评价"),
             (5, "已完成"),
         )
    
         status = models.SmallIntegerField(default=1,
                                           verbose_name='订单状态',
                                           choices=ORDER_STATUS_CHOICES)
    
         class Meta(object):
             db_table = 'df_test'
             # 指定模型在后台显示的名称
             verbose_name = '测试模型'
             # 去除后台显示的名称默认添加的 's'
             verbose_name_plural = verbose_name
    
  2. 在后台注册

     # apps/users/admin.py
     from django.contrib import admin
     from apps.users.models import TestModel
    
     admin.site.register(TestModel)
    
  3. 创建django后台登录账号,并登录到后台



二、富文本编辑器使用

HTMLField富文本控件的显示效果:

使用方式:

  1. 安装依赖:

     pip install django-tinymce==2.6.0
    
  2. setting.py文件中配置

     INSTALLED_APPS = (
       ...
       'tinymce',   # 使用应用
     )
    
     # 配置控件显示样式
     TINYMCE_DEFAULT_CONFIG = {
       'theme': 'advanced', # 丰富样式
       'width': 600,
       'height': 400,
     }
    
  3. 项目/urls.py中配置url

     import tinymce.urls
    
     urlpatterns = [
           ...
    
         # 包含tinymce urls配置文件
           url(r'^tinymce/', include('tinymce.urls')),
     ]
    
  4. 在模型类中使用HTMLField

     class TestModel(models.Model):
         """测试"""
    
         # 富文本控件
         desc = HTMLField(verbose_name='商品描述', null=True)
    
         ...
    
  5. 重新迁移数据库,登录到后台进行测试

三、修改 GoodsSPU 模型类的商品详情

  1. 把GoodsSPU模型类的 商品详情 字段类型 改为 HTMLField 类型

     class GoodsSPU(BaseModel):
         """商品SPU表"""
    
         desc = HTMLField(verbose_name="商品描述", default="", blank=True)
         ...
    
  2. 重新迁移数据库,生成表

  3. 注册: GoodsSPU 模型类,让它在后台显示,使用富文本录入 商品详情

     # 注册模型类,让它在后台显示
     from apps.goods.models import GoodsSPU
    
     admin.site.register(GoodsSPU)

联系方式

QQ :1217675462

欢迎交流

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐