Django站点管理(后台管理员)

前言

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

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

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

1. 激活Django站点

1.1 本地化 (语言和时区)

修改settings.py文件。

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

1.2 创建登录后台的管理员

python3 manage.py createsuperuser
依次指定: 用户名,邮箱,密码

在这里插入图片描述

1.3 注册模型类

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

# admin.py:
from app01.models import Department, Employee
 
# 注册Model类
admin.site.register(Department)
admin.site.register(Employee)

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

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

# 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)

1.5 启动服务器,查看效果

python manage.py runserver

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

http://127.0.0.1:8000/admin

2. 准备工作

步骤1.创建Area区域模型类

class Area(models.Model):
    """地区类"""
    title = models.CharField(max_length=50)
    # 外键: 自关联
    parent = models.ForeignKey('self', null=True, blank=True)

步骤2.生成迁移文件,再作迁移,生成数据库表;

步骤3.插入测试数据

步骤4.创建后台管理器账号

python manage.py createsuperuser
按提示填写用户名、邮箱、密码,确认密码。

步骤5.注册模型类
要在后台要能看到模型类表,需要在admin.py中注册模型类

from django.contrib import admin
from models import *
 
admin.site.register(Area)

步骤6.登录后台,查看效果

通过http://127.0.0.1:8000/admin/访问服务器: 输入刚创建的用户名和密码,登录到后台管理界面,登录成功可以看到如下,可以对Area进行增加、修改、删除、查询的管理操作:
在这里插入图片描述

3. 列表页选项

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

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

class AreaAdmin(admin.ModelAdmin):
    pass

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

admin.site.register(AreaInfo, AreaAdmin)

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

3.1 每页显示多少条

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

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

在浏览器中查看区域信息的列表页面,效果如下图:
在这里插入图片描述

3.2 设置操作选项的位置

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

在浏览器中刷新效果如下图:
在这里插入图片描述

3.3 列表中的列操作

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

# 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']

3.4 修改显示的列的名字

列标题默认为属性或方法的名称,可以通过属性设置。对于模型属性,通过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'

3.5 右侧栏过滤器

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

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

刷新效果如下:
在这里插入图片描述

3.6 搜索框

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

# admin.py
class AreaAdmin(ModelAdmin):
    ...
 
    # 要搜索的列的值 
    search_fields = ['title']

刷新效果如下:
在这里插入图片描述

4. 编辑页选项

4.1 显示字段顺序

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

刷新效果如下:
在这里插入图片描述

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

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

刷新效果如下:
在这里插入图片描述

4.3 字段分组显示

格式如下:

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

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

代码:

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

4.4 编辑关联对象

  • 在一对多的关系中,可以在一端的编辑页面中编辑多端的对象,嵌入多端对象的方式包括表格、块两种
  • 类型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]

刷新效果如下:
在这里插入图片描述

4.5 修改预留新增选项

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

在这里插入图片描述

5. 重写后台管理模板

进入到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内容:

新增一行代码,如下图:
在这里插入图片描述刷新结果:
在这里插入图片描述

6. choices选项和富文本编辑器

6.1 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
  1. 在后台注册
# apps/users/admin.py
 from django.contrib import admin
 from apps.users.models import TestModel
 
 admin.site.register(TestModel)
  1. 创建django后台登录账号,并登录到后台
    在这里插入图片描述

6.2 富文本编辑器使用

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

使用方式:

1.安装依赖:

pip install django-tinymce==2.6.0
  1. setting.py文件中配置
INSTALLED_APPS = (
   ...
   'tinymce',   # 使用应用
 )
 
 # 配置控件显示样式
 TINYMCE_DEFAULT_CONFIG = {
   'theme': 'advanced', # 丰富样式
   'width': 600,
   'height': 400,
 }
  1. 项目/urls.py中配置url
 import tinymce.urls
 
 urlpatterns = [
       ...
 
     # 包含tinymce urls配置文件
       url(r'^tinymce/', include('tinymce.urls')),
 ]
  1. 在模型类中使用HTMLField
 class TestModel(models.Model):
     """测试"""
 
     # 富文本控件
     desc = HTMLField(verbose_name='商品描述', null=True)
 
     ...
  1. 重新迁移数据库,登录到后台进行测试

6.3 修改 GoodsSPU 模型类的商品详情

  1. 把GoodsSPU模型类的 商品详情 字段类型 改为 HTMLField 类型
class GoodsSPU(BaseModel):
     """商品SPU表"""
 
     desc = HTMLField(verbose_name="商品描述", default="", blank=True)
     ...
  1. 重新迁移数据库,生成表

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

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

原文链接:https://blog.csdn.net/weixin_41790086/article/details/80726585

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕城南风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值