0%

Django使用后台管理系统

其实Django有自带的后台管理系统,但是不利于我们的学习,所以这里只做简要介绍。

因此关于Django自带后台管理的部分若要实践操作建议新建分支,数据库做好备份或docker做好备份以便还原

Django自带的后台管理系统

数据库迁移

首先要执行相关数据库迁移

1
2
$ python manage.py makemigrations
$ python manage.py migrate

会在数据库中新建相关表

添加超管

1
$ python manage.py createsuperuser

根据提示创建用户名,输入邮箱地址,输入密码并确认。

效果

image-20200706234136567

使用第三方后台管理系统

注意!以下内容要求读者具有cookie与session的基础知识!

新建app并设置路由

我使用是hAdmin的后台管理模板,那就取名字叫hadmin吧

1
$ python manage.py startapp hadmin

在hadmin文件夹下边新建urls.py

hadmin/urls.py
1
2
3
4
5
6
from django.conf.urls import url
from . import views

urlpatterns = [
# 以后hadmin的url映射在这里配置即可
]
hotel.py
1
2
3
4
5
6
7
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
# path('admin/', admin.site.urls),
path('admin/', include('hadmin.urls'))
]

配置静态路径和模目录的操作不再赘述

建立数据库、表与Model

请按如下修改配置settings.py

settings.py
1
2
3
4
5
6
7
8
9
10
11
12
-LANGUAGE_CODE = 'en-US'
+LANGUAGE_CODE = 'zh-hans'

-TIME_ZONE = 'UTC'
+TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

-USE_TZ = True
+USE_TZ = False

配置数据库的操作请看前面的文章

这里我使用从数据库迁移到model文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`name` varchar(100) NOT NULL COMMENT '用户名',
`pwd` varchar(50) NOT NULL COMMENT '密码',
`type` int(11) DEFAULT '0' COMMENT '权限类型',
`createdAt` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updatedAt` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理员';

DROP TABLE IF EXISTS `coupon`;
CREATE TABLE `coupon` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`name` varchar(100) DEFAULT NULL COMMENT '名字',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='优惠券';

DROP TABLE IF EXISTS `customer`;
CREATE TABLE `customer` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`name` varchar(200) DEFAULT NULL COMMENT '姓名',
`phoneNumber` varchar(20) DEFAULT NULL COMMENT '电话号码',
`coupon` int(11) DEFAULT NULL COMMENT '优惠券',
`type` int(11) DEFAULT '0' COMMENT '入住状态',
`checkin` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '入住时间',
`checkout` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '退房时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='顾客';

DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`name` varchar(100) DEFAULT NULL COMMENT '姓名',
`gender` varchar(2) DEFAULT NULL COMMENT '性别',
`id_card` varchar(20) DEFAULT NULL COMMENT '身份证号码',
`job` int(11) DEFAULT NULL COMMENT '职位',
`job_number` int(11) DEFAULT NULL COMMENT '工号',
`path` varchar(50) DEFAULT NULL COMMENT '图片路径',
`address` varchar(50) DEFAULT NULL COMMENT '地址',
`evaluation` varchar(100) DEFAULT NULL COMMENT '评价',
`description` varchar(100) DEFAULT NULL COMMENT '描述',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工';

DROP TABLE IF EXISTS `jobs`;
CREATE TABLE `jobs` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`name` varchar(100) DEFAULT NULL COMMENT '名字',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='工作';

DROP TABLE IF EXISTS `log`;
CREATE TABLE `log` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`content` varchar(300) DEFAULT NULL COMMENT '内容',
`time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='操作记录';

执行迁移

1
python manage.py inspectdb > hadmin/models.py

然后在数据库中添加一条数据:

1
INSERT INTO `admin` ( `name`, `pwd`, `type` ) VALUES ( 'admin', 'admin', 1 );

为了检验,可以使用view来插入数据看看是否配置成功。

模板修改

Django操作数据库如果允许为空值,执行的SQL语句可能是全部字段,对应的NULL字段就是NULL,因此我们需要自己把默认值在models里加上。

from datetime import datetime

  1. default=datetime.now()

    model每次初始化,都会自动设置该字段的默认值为初始化时间。

  2. default=datetime.now

    model每次进行新增或修改操作,都会自动设置该字段的值为操作时间。设置后仍可以使用ORM手动修改该字段。

  3. auto_now_add=True

    默认值为False,若设置为True,model每次进行新增操作,都会自动设置该字段的值为操作时间。设置为True后无法使用ORM手动修改该字段,哪怕填充了字段的值也会被覆盖。

  4. auto_now=True

    默认值为False,若设置为True,model每次进行新增或修改操作,都会自动设置该字段的值为操作时间。设置为True后无法使用ORM手动修改该字段,哪怕填充了字段的值也会被覆盖。
    ————————————————
    版权声明:本文为CSDN博主「旷古的寂寞」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/kuanggudejimo/article/details/99291026

登陆系统

参考文章

session存储位置

settings.py
1
2
3
4
5
6
7
8
9
10
11
12
13
# Django默认配置,保存到数据库
# SESSION_ENGINE = 'django.contrib.sessions.backends.db'

# 只保存在cache中
# 有可能因内存溢出而导致找不到
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

# db和cache都保存,查找的时候先取cache中查找,找不到再转到db中查找
# SESSION_ENGINE = 'django.contrib.sessions.backends.cache_db'

# 保存到文件系统,文件位置(确保有权限,Django默认是系统的临时文件目录tempfile.gettempdir())
# SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# SESSION_FILE_PATH = 'xxx'

在文件末尾添加,这里为了省事,保存在缓存里

设置session与cookie

为了数据安全,如果登陆成功,我们需要把id和用户名保存在session中,cookie会自动添加一个key为sessionid,value为随机字符串的键值对。session和cookie默认保存两周。

我想让cookie关闭浏览器时清除,则需要配置一下settings.py,添加如下内容

settings.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
#
# SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
#
# SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
#
# SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
#
# SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
#
# SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
#
SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 是否关闭浏览器使得Session过期(默认False)
#
# SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)

image-20200708122928533

实现:

views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def login(request):
return render(request, 'login.html')


@csrf_exempt
def doLogin(request):
m = models.Admin.objects.get(name=request.POST['name'])
print(request.session.keys())
if m.pwd == request.POST['pwd']:
request.session['id'] = m.id
request.session['name'] = m.name
return HttpResponse("True")
else:
return HttpResponse("Your username and password didn't match.")


def index(request):
return render(request, "index.html")

添加登陆页面与主页

这个去随便找一个模板改改就好了,我的登陆逻辑如下(jQuery):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$("#entry_btn").click(function () {
var name = $("#name").val();
var pwd = $("#pwd").val();

$.post("/admin/doLogin/", {"name": name, "pwd": pwd}, function (data) {
if (data == "True") {
alert('True');
window.location.href = "/admin/index/"
} else {
alert(data)
}

});
});

设置url过滤

除了登陆相关,其他要拦截验证cookie,所以需要定义一个中间件

参考文章

LoginFilter.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django.http import HttpResponseRedirect
from django.utils.deprecation import MiddlewareMixin


class LoginFilter(MiddlewareMixin):
def process_request(self, request):
path = request.path_info.lstrip('/')
if path.find('admin') != -1: # 如果admin开头的url
urls = {'admin/', 'admin/login/', 'admin/doLogin/'} # 可放行url
if path in urls:
print('pass')
else:
print('filter')
ID = request.session.get('id')
if not ID: # 如果session中没有id,则返回登录页面
return HttpResponseRedirect('/admin/login')
# 如果有就放行

然后注册中间件

settings.py
1
2
3
4
5
6
7
8
9
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

使用hAdmin

-----------看到底线啦 感谢您的阅读-------------