代码在以下~https://gitee.com/hedyyi/myobject.git
以下为笔记~
项目搭建:
1.创建项目:django-admin startproject myobject
2.创建应用:python manage.py startapp myadmin/web/mobile
3.创建模板目录:templates(模板中对应各应用目录myadmin/web/mobile)
4.创建静态资源目录:static(目录中对应各应用目录myadmin/web/mobile,并放置图片文件uploads)
5.在每一个应用目录下创建视图包views并删除原有的views.py (init.py和index.py)
5.将项目myobject中的路由文件url.py复制一份到各应用目录下
6.项目框架配置;项目myobject目录下setting.py文件
1. 配置允许访问的主机名信息 ALLOWED_HOSTS = ['*']
2. 将myadmin,web,mobile的应用添加到项目框架结构中 INSTALLED_APPS
3. 配置模板目录 os.path.join(BASE_DIR,'templates')
TEMPLATES
4. 配置项目的数据库连接信息;DATABASES
5. 设置时区和语言 LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
6. 配置网站的静态资源目录 STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
7.项目myobject目录下路由urls.py配置
引入包
from django.urls import include
urlpatterns = [
#path('admin/', admin.site.urls),
path('', include("web.urls")), # 默认前台大堂点餐端
path('myadmin/', include("myadmin.urls")), # 后台管理端
path('mobile/', include("mobile.urls")), # 移动会员端
]
8.在各应用目录下路由urls.py配置
from django.urls import path
from myadmin.views import index
urlpatterns = [
# 后台首页
path('', index.index, name="myadmin_index"),
]
9.在各应用目录下视图 views/index.py配置
from django.shortcuts import render
from django.http import HttpResponse
#后台首页
def index(request):
return HttpResponse('欢迎进入点餐系统网站后台管理!')
10.运行测试;在项目根目录下启动服务;python manage.py runserver
11.摆放后台首页面(涉及前端内容)从github上下载一个后台简洁模板:https://github.com/ColorlibHQ/AdminLTE
12.将模板里面的bower_components、dist、local、package.json复制到项目的后台静态资源目录static/myadmin/中
13.在templates/myadmin创建index目录,里面创建index.html文件,将github下载下来的html页面内容复制进来,将里面的路径进行填充{% static 'myadmin/... '%}
14.在templates/myadmin创建base.html文件,以便继承使用,将index.html里面的内容全剪切过来,将不需要继承的地方剪切并进行占位 {% block main_body %} {% endblock %}
15.回到index.html文件中进行继承;{% extends 'myadmin/base.html' %};
表示继承myadmin下面的base.html文件
{% block main_body %}
上一步剪切的东西复制过来
{% endblock %}
项目实战-后台员工信息管理-
16.在数据库中创建user表(员工账号id,员工账号,昵称,密码,密码干扰值,状态,创建时间,修改时间)
17.定义Model类(myadmin/models.py);定时列表中的字段信息
18.新增视图文件(myadmin/views/user.py),主要定义增删改查的方法;
18.配置urls路由信息;(myadmin/urls.py),将定义的增删改查的方法路由放进去
19.编辑后台模板,创建templates/myadmin/user/index.html,继承base.html内容 并将AdminLTE中部分内容复制进去修改复制到index.html即可(主要改下列表显示的字段信息以及进行循环并各种判断)
20.编辑base.html内容,将首页和员工管理的地址进行反解析,首页{% url ‘myadmin_index’ %};员工管理{% url ‘myadmin_user_index’ %}
21.列表分页操作;在myadmin/views/user.py浏览方法里添加分页操作;
22.templates/myadmin/user/index.html文件中循环列表数据,以及加上选中当前页面以及上一页下一页的判断
23.列表搜索;复制搜索条件到index.html (
<div class="input-group-btn">
<button type="submit" class="btn btn-default"><i class="fa fa-search"></i></button>
</div>
</div>
</form>
24.在myadmin/views/user.py中继续封装完善方法;
“”“获取,判断并封装keyword键搜索”“”
mywhere = []
kw = request.GET.get(“keyword”,None)
if kw:
#ulist = ulist.filter(username__contains=kw) #单个搜索
ulist = ulist.filter(Q(username__contains=kw) | Q(nickname__contains=kw)) #Q是表示为且的关系
mywhere.append(“keyword=”+kw)
25.在index.html完善根据搜索条件翻页的时候也能被选中
<li><a href="{% url 'myadmin_user_index' pIndex|add:-1 %}?{
{ mywhere|join:'&' }}">«</a></li>
{
% for p in plist %}
{
#根据判断条件数据当前页列表#}
<li {
% if p == pIndex %} class="active"{
% endif %}><a href="{% url 'myadmin_user_index' p %}?{
{ mywhere|join:'&' }}">{
{
p }}</a></li>
{
% endfor %}
{
#下一页#}
<li><a href="{% url 'myadmin_user_index' pIndex|add:1 %}?{
{ mywhere|join:'&' }}">»</a></li>
26.添加操作;myadmin/views/user.py
add;仅加载页面return render(request, "myadmin/user/add.html")
insert执行添加;return render(request, "myadmin/info.html", context);
进行添加操作需要的内容封装
27.创建myadmin/user/add.html;在AdminLTE中找到add.html相关的,复制部分即可;记得继承
{% extends “myadmin/base.html” %}
{% block main_body %}
这里放置添加的内容
{% endblock %}
28.创建myadmin/info.html;主要是为了添加成功后的提示。
{
% extends "myadmin/base.html" %}
{
% block main_body %}
<!-- Content Header (Page header) -->
<section class="content-header">
<h4>
信息提示:
</h4>
</section>
<div class="pad margin no-print">
<div class="callout callout-info" style="margin-bottom: 0!important;padding-left: 50px">
<h3><i class="fa fa-exclamation-triangle"></i> {
{
info }}</h3>
</div>
</div>
{
% endblock %}
29.在myadmin/user/indexl.html;更改add.html这部分内容;
<a role="button" href="{% url 'myadmin_user_add' %}" class="btn btn-primary">
30.即可在页面添加操作成功
31.删除操作;myadmin/views/user.py;继续封装完善
def delete(request,uid=0):
'''执行添加'''
try:
ob = User.objects.get(id=uid)
ob.status = 9
ob.update_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
ob.save()
context = {
"info": "删除成功!"}
except Exception as err:
print(err)
context = {
"info": "删除失败"}
return render(request, "myadmin/info.html", context)
32.在myadmin/user/index.html,在删除按钮的操作上,把url渲染进去
<button type="button" onclick="doDel('{% url 'myadmin_user_delete' vo.id %}')" class="btn btn-danger btn-xs">
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span> 删除</button>
33.在templates/myadmin/base.html中加入删除成功后的提示信息
<script type="text/javascript">
function doDel(url){
Modal.confirm({
msg: "确定要删除吗?",
title: ' 信息提示',
btnok: '确定',
btncl:'取消'
}).on(function (e){
if(e){
window.location.href=url;
}
});
}
34.即可在页面上删除成功操作
35.编辑修改操作;封装edit和update方法;
def edit(request,uid=0):
'''执行添加'''
try:
ob = User.objects.get(id=uid)
context = {
"user": ob}
return render(request, "myadmin/user/edit.html", context)
except Exception as err:
print(err)
context = {
"info": "没有找到要修改的信息"}
return render(request, "myadmin/info.html", context)
def update(request,uid):
'''执行添加'''
try:
ob = User.objects.get(id=uid)
ob.status = request.POST['status']
ob.nickname = request.POST['nickname']
ob.update_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
ob.save()
context = {
"info": "修改成功!"}
except Exception as err:
print(err)
context = {
"info": "修改失败!"}
return render(request, "myadmin/info.html", context)
36.新增templates/user/edit.html页面(复制add.html再修改即可)
37.修改index.html中编辑的跳转链接
<a type="button" href="{% url 'myadmin_user_edit' vo.id %}" class="btn btn-success btn-xs">
<span class="glyphicon glyphicon-edit" aria-hidden="true"></span> 编辑</a>
38.增删改查即完成操作
39.项目实战之后台管理员登陆与退出,会使用到Django框架中的session,而session信息又存放的数据库中,所以要先使用数据迁移命令在MySQL数据库中先生成一些Django默认自带表。 python manage.py migrate
40.添加中间件,此中间件对后台网址访问做了是否登录的判断,只要访问的URL地址是以 “/admin” 开头的都会执行是否登录判断验证
41.在myadmin应用中创建中间件,创建文件:myobject/myadmin/shopmiddleware.py
# 自定义中间件类
from django.shortcuts import redirect
from django.urls import reverse
import re
class ShopMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
print("ShopMiddleware")
def __call__(self, request):
# 获取当前请求路径
path = request.path
#print("mycall..."+path)
# 后台请求路由判断
# 定义网站后台不用登录也可访问的路由url
urllist = ['/myadmin/login','/myadmin/dologin','/myadmin/logout','/myadmin/verify']
# 判断当前请求是否是访问网站后台,并且path不在urllist中
if re.match(r"^/myadmin",path) and (path not in urllist):
# 判断当前用户是否没有登录
if "adminuser" not in request.session:
# 执行登录界面跳转
return redirect(reverse('myadmin_login'))
# 请求继续执行下去
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response
42.将自定义的中间件注册到项目中,编辑 myobject/settings.py 配置文件,添加代码
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',
'myadmin.shopmiddleware.ShopMiddleware', #注册中间件
]
43.配置路由、模板并测试中间件;配置路由 myobject/myadmin/urls.py 加入如下代码
# 后台管理员路由
path('login', index.login, name="myadmin_login"),
path('dologin', index.dologin, name="myadmin_dologin"),
path('logout', index.logout, name="myadmin_logout"),
44.编写视图 myobject/myadmin/views/index.py文件 并加入如下代码
# ==============后台管理员操作====================
# 会员登录表单
def login(request):
return render(request,'myadmin/index/login.html')
# 会员执行登录
def dologin(request):
pass
# 会员退出
def logout(request):
pass
45.创建登录模板文件: templates/myadmin/index/login.html 代码如下
{
% load static from static%}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>后台管理登录界面</title>
<!-- 支持响应式布局 -->
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<link rel="stylesheet" href=