第6次:Admin后台管理系统

Django提供了一个强大的后台管理系统,此系统以模型为中心,方便管理员对数据库表进行管理。

6.1 创建账号设置语言

创建Django项目时,勾选admin选项,此时根路由中会默认定义admin/路由,通过http://127.0.0.1:8000/admin/可进入后台管理页面。
在这里插入图片描述
首次使用这个后台,需要创建管理员用户名和密码,创建账号、密码的操作如下

python manage.py createsuperuser

Username (leave blank to use 'abc'):  admin
Email address:  123@qq.com
Warning: Password input may be echoed.
Password:  12345678
Warning: Password input may be echoed.
Password (again):  12345678
This password is too common.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]:  y
Superuser created successfully.

登录之后会发现界面全是英文的,后台管理系统默认使用英文,可以settings.py中设置为中文

LANGUAGE_CODE = 'zh-Hans'

另一种设置语言的方式是在settings.py文件中将配置项MIDDLEWARE中添加中间件’django.middleware.locale.LocaleMiddleware’

推荐使用第一种方式,简单好记。

设置完成后,刷新页面即可看到中文界面。
在这里插入图片描述

此时,并未看到数据表。若想在后台管理系统中看到模型数据,需要将模型注册到后台系统中。

首先创建一个goods应用,再此应用下创建一个模型类

from django.db import models

class Goods(models.Model):
    # 可以利用null和blank属性使部分字段留空
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
    name = models.CharField(max_length=50, verbose_name='名字')
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='价格')
    stock = models.IntegerField(default=0, verbose_name='库存')
    sales = models.IntegerField(default=0, verbose_name='销量')

    class Meta:
        db_table = 'tb_goods'
        verbose_name = '商品'
        verbose_name_plural = '商品s'

    def __str__(self):
        return f'id:{self.id},name:{self.name},price:{self.price},stock:{self.stock},sales:{self.sales}'

6.2 模型的注册

将模型注册到后台管理系统的方式有两种,注册均在此应用的admin.py中完成。

第一种是通过装饰器,在goods/admin.py中

from django.contrib import admin
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
    pass

第二种是代码注册

from django.contrib import admin
from goods.models import Goods

class GoodsAdmin(admin.ModelAdmin):
    pass

admin.site.register(Goods, GoodsAdmin)

装饰器注册更简洁,推荐使用这种方式。

然后生成迁移文件和执行迁移文件两步操作,运行项目,访问http://127.0.0.1:8000/admin/,可从后台看到
在这里插入图片描述

上图中的GOODS对应的是应用的名字,如果想给它起个中文名字的话,可在goods应用下的__init__.py文件中添加如下设置,表示加载goods/apps.py文件中的GoodsConfig的配置信息。

default_app_config = 'goods.apps.GoodsConfig'

然后在goods/apps.py文件的GoodsConfig类中使用verbose_name设置应用的别名

class GoodsConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'goods'
    verbose_name = '商品信息'

此时刷新后台页面即可看到原来的GOODS变成了商品信息

6.3 数据的管理

对后台信息初步配置之后,即可进行常见的数据管理,如数据表的增删改查。

新增数据时,只须输入如下4个字段,因创建时间和更新时间为系统自动输入,所以此处默认不显示。
在这里插入图片描述
完成新增数据后,可查看数据,默认的显示方式为如下格式,(字段名:数据)
在这里插入图片描述

如上,未显示所有字段信息,且显示较拥挤。如果想显示全部字段信息,可通过goods/admin.py中的list_display选项来配置,配置后可以表格形式展示数据。

list_display选项用于控制页面展示的字段,选项的值可是元组,也可是列表,更推荐列表,因为元组只包含一个元素时,要加逗号

list_display = ('id', 'create_time', 'update_time', 'name', 'price', 'stock', 'sales')

在这里插入图片描述

若想以以链接形式展示字段,可使用list_display_links选项

list_display_links = ('id', 'name')

此时点击这两个字段会进行相应记录的编辑页面
在这里插入图片描述

如果想对数据过滤查询,可使用list_filter选项

list_filter = ['stock','price','name']

若想设置每个页面显示10条,分页显示,可通过list_per_page选项

list_per_page = 10

若想在列表中直接编辑某个字段,可通过list_editable选项配置,但须注意同一字段不能同时出现在list_editablelist_display_links中。

list_editable = ['price']

在这里插入图片描述
若想直接搜索数据表中数据,可通过search_fields选项,支持多条件搜索,以空格分隔筛选条件。
在这里插入图片描述

如果想控制编辑页要展示的字段,可通过fields选项,它的值是为元组或列表类型。

fields = ['name', 'price']

在这里插入图片描述
如果想对可编辑字段分组,可使用fieldsets选项,注意此选项不可与fields同时使用。

fieldsets = (
    ('基本信息', {'fields': ['name', 'stock', 'sales']}),
    ('价格信息', {'fields': ['price']})
)

在这里插入图片描述

6.4 权限管理

后台管理系统可能需要多人来使用,为了数据的安全,需要对所有用户的操作权限进行统一管理。

Admin管理系统提供了完善的用户认证与授权的功能,既可对用户单独授权,也可通过分组对用户授权。

增加一个用户
在这里插入图片描述

增加用户后,打开此用户信息,为其它分配权限

在这里插入图片描述
增加一个组
在这里插入图片描述
如果一个用户同时拥有自己权限和并属于某个分组,他将拥有两个部分的权限的组合。

6.5 重写后台模板

(1)创建目录,templates和static,并在templates下创建admin目录;
(2)在templates/admin创建base_site.html,base_site.html代码如下

{% extends "admin/base.html" %}
{% load static %}
{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}
{% endblock %}
{% block branding %}
    <h1 id="site-name">
        <a href="{% url 'admin:index' %}">
            <!--  logo.png为网站logo图片-->
            <img src="{% static 'logo.png' %}" height="40px"/>
        </a>
    </h1>
{% endblock %}
{% block nav-global %}{% endblock %}

在settings.py中配置模板路径

'DIRS': ['templates'],

(3)在setting.py文件中配置目录

STATIC_URL = 'static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]

(4)把准备好的logo图片添加到static目录下边。
(5)运行看效果。

附数据:

INSERT INTO tb_goods (create_time, update_time, name, price, stock, sales) VALUES
('2019-09-11 17:28:21.804713', '2019-09-25 11:09:04.532866', 'Apple MacBook Pro 13.3英寸笔记本 银色', 11388, 5, 5),
('2019-09-12 06:53:54.575306', '2019-09-23 11:44:03.825103', 'Apple MacBook Pro 13.3英寸笔记本 深灰色', 11398, 0, 1),
('2019-09-14 02:14:04.599169', '2019-09-20 02:28:13.579856', 'Apple iPhone 11 Pro 256GB 香芋紫', 6499, 6, 4),
('2019-09-14 02:20:33.355996', '2019-09-14 17:27:12.736139', 'Apple iPhone 11 Plus 256GB 金色', 7988, 8, 2),
('2019-09-14 02:45:23.341909', '2019-09-14 17:27:17.181609', 'Apple iPhone 11 Plus 64GB 深空灰色', 6688, 10, 0),
('2019-09-14 02:49:40.912682', '2019-09-25 11:09:35.936530', 'Apple iPhone 11 Plus 256GB 深空灰色', 7988, 0, 5),
('2019-09-14 02:55:11.172604', '2019-09-14 17:27:28.772353', 'Apple iPhone 11 Plus 64GB 银色', 6688, 3, 0),
('2019-09-14 02:56:17.331169', '2019-09-14 17:27:34.536772', 'Apple iPhone 11 Plus 256GB 银色', 7988, 9, 1),
('2019-09-14 03:09:00.909709', '2019-09-14 17:27:40.624770', '华为 HUAWEI Pro 30 6GB+64GB 钻雕金', 3388, 4, 0),
( '2019-09-14 03:13:40.226704', '2019-09-25 11:06:55.087206', '华为 HUAWEI Pro 30 6GB+128GB 钻雕金', 3788, 3, 0),
( '2019-09-14 03:16:27.620102', '2019-09-25 10:56:51.267674', '华为 HUAWEI Pro 30 6GB+128GB 钻雕蓝', 3788, 5, 0),
( '2019-09-14 03:17:25.671905', '2019-09-14 17:28:06.649098', '华为 HUAWEI Pro 30 6GB+64GB 钻雕蓝', 3388, 5, 0),
( '2019-09-14 03:18:04.588296', '2019-09-14 17:28:23.886231', '华为 HUAWEI Pro 30 6GB+64GB 玫瑰金', 3388, 5, 0),
( '2019-09-14 03:19:03.691772', '2019-09-25 11:10:51.316291', '华为 HUAWEI Pro 30 6GB+128GB 玫瑰金', 3788, 0, 4),
( '2019-09-20 02:27:04.955931', '2019-09-20 02:27:04.956931', 'Apple iPhone 11 Pro 256GB 香芋紫', 6499, 6, 3);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值