上海城市建设网站,专业软件开发培训机构,杭州公司摇号需要哪些资格条件,建设网站前的市场分析怎么写目录
一、创建django项目
二、修改默认配置
三、配置数据库连接
四、创建表结构
五、在app当中创建静态文件
六、页面实战-部门管理
1、实现一个部门列表页面
2、实现新增部门页面
3、实现删除部门
4、实现部门编辑功能
七、模版的继承
1、创建模板layout.html
1将公共的部分写进模版
2后续新的html页面使用下面方法继承模版
2、将depart_list.html页面使用模版重构
3、将depart_add.html页面重构
4、将depart_edit.html页面重构
八、页面实战-用户管理
1、uri注册
2、views.py
3、用户列表页面
4、添加用户user_add.html--- 老方法
5、添加用户user_model_form_add.html--- 新方法ModelForm
6、解决提示英文问题 7、编辑用户 -新增user_edit.html页面
8、编辑用户 -修改views.py
9、修改数据库入职时间为年月日格式
10、删除用户在views.py新增user_delete方法 一、创建django项目
使用pycharm创建django项目 二、修改默认配置
1、删除settings配置
删除下图[]内容 2、删除templates文件夹
三、创建app应用与注册应用
1、创建app
# XXX项目名
python manage.py startapp xxx
2、注册app
修改settings如下图红色方框是创建的app名 三、配置数据库连接
1、安装pymysql
pip install pymysql2、配置在项目同名包下的_init_.py里面添加
import pymysql
pymysql.install_as_MySQLdb()
3、修改settings.py
,注释db.sqlite3的配置新增下图
# DATABASES {
# default: {
# ENGINE: django.db.backends.sqlite3,
# NAME: BASE_DIR / db.sqlite3,
# }
# }DATABASES {default: {ENGINE: django.db.backends.mysql, # 数据库的类型NAME: texx, # 所使用的的数据库的名字USER: root, # 数据库服务器的用户PASSWORD: xxxx, # 密码HOST: 127.0.0.1, # 主机PORT: 3306, # 端口}
}
四、创建表结构 1、在models.py创建类
from django.db import models# Create your models here.class Department(models.Model):部门表name models.CharField(verbose_name部门名称, max_length20)class UserInfo(models.Model):员工表name models.CharField(verbose_name姓名, max_length20)password models.CharField(verbose_name密码, max_length64)age models.IntegerField(verbose_name年龄)gender_choices ((1, 男), (2, 女))gender models.SmallIntegerField(verbose_name性别,choicesgender_choices)account models.DecimalField(verbose_name账户余额, max_digits10, decimal_places2,default0)create_time models.DateTimeField(verbose_name入职时间)# depart会自动生成字段为depart_id# 级联删除 on_deletemodels.CASCADE# 置空 on_deletemodels.SET_NULL 但是必须和nullTrue, blankTrue配合使用因为你得支持为nulldepart models.ForeignKey(toDepartment, to_fieldid, on_deletemodels.CASCADE)2、创建一个mysql数据库略 3、django命令生成库表
python manage.py makemigrations
python manage.py migrate
另一个方法按下图操作之后就可省略上图 python manage.py 命令直接输入后面的即可 五、在app当中创建静态文件
1、创建下图目录 2、将下载的bootstrap-3.4.1复制到plugins 3、将下载的jquery-3.6.3.min.js复制到js 4、在app应用下创建templates文件夹 六、页面实战-部门管理 1、实现一个部门列表页面
1设置部门列表路由
from django.contrib import admin
from django.urls import path
from TestManagementSystem import viewsurlpatterns [# path(admin/, admin.site.urls),path(depart/list/, views.depart_list),
]2创建部门列表views.py视图
from django.shortcuts import render
from TestManagementSystem import models
# Create your views here.def depart_list(request):部门列表# 查询所有部门depart_set models.Department.objects.all()print(depart_set)return render(request, depart_list.html, {depart_set: depart_set})3创建部门列表html页面
在templates下创建depart_list.html
先引入样式、js等
{% load static %}
!DOCTYPE html
html langen
headmeta charsetUTF-8title部门列表/titlelink relstylesheet href{% static plugins/bootstrap-3.4.1/css/bootstrap.min.css %}
/head
bodyscript src{% static js/jquery-3.6.3.min.js%}/scriptscript src{% static plugins/bootstrap-3.4.1/js/bootstrap.js%}/script
/body
/html
加入导航
{% load static %}
!DOCTYPE html
html langen
headmeta charsetUTF-8title部门列表/titlelink relstylesheet href{% static plugins/bootstrap-3.4.1/css/bootstrap.min.css %}//head
bodynav classnavbar navbar-defaultdiv classcontainer-fluiddiv classnavbar-headerbutton typebutton classnavbar-toggle collapsed data-togglecollapse data-target#bs-example-navbar-collapse-1 aria-expandedfalsespan classsr-onlyToggle navigation/spanspan classicon-bar/spanspan classicon-bar/spanspan classicon-bar/span/buttona classnavbar-brand href#测试管理系统/a/divdiv classcollapse navbar-collapse idbs-example-navbar-collapse-1ul classnav navbar-navlia href/depart/list/部门管理/a/lilia href#Link/a/li/ulul classnav navbar-nav navbar-rightlia href#登录/a/lili classdropdowna href# classdropdown-toggle data-toggledropdown rolebutton aria-haspopuptrue aria-expandedfalse春天的菠菜 span classcaret/span/aul classdropdown-menulia href#个人资料/a/lilia href#我的信息/a/lili roleseparator classdivider/lilia href#注销/a/li/ul/li/ul/div/div
/navscript src{% static js/jquery-3.6.3.min.js%}/scriptscript src{% static plugins/bootstrap-3.4.1/js/bootstrap.js%}/script
/body
/html
完成动态数据
{% load static %}
!DOCTYPE html
html langen
headmeta charsetUTF-8title部门列表/titlelink relstylesheet href{% static plugins/bootstrap-3.4.1/css/bootstrap.min.css %}//head
bodynav classnavbar navbar-defaultdiv classcontainer !-- div classcontainer-fluid --div classnavbar-headerbutton typebutton classnavbar-toggle collapsed data-togglecollapsedata-target#bs-example-navbar-collapse-1 aria-expandedfalsespan classsr-onlyToggle navigation/spanspan classicon-bar/spanspan classicon-bar/spanspan classicon-bar/span/buttona classnavbar-brand href#测试管理系统/a/divdiv classcollapse navbar-collapse idbs-example-navbar-collapse-1ul classnav navbar-navlia href/depart/list/部门管理/a/lilia href#Link/a/li/ulul classnav navbar-nav navbar-rightlia href#登录/a/lili classdropdowna href# classdropdown-toggle data-toggledropdown rolebutton aria-haspopuptruearia-expandedfalse春天的菠菜 span classcaret/span/aul classdropdown-menulia href#个人资料/a/lilia href#我的信息/a/lili roleseparator classdivider/lilia href#注销/a/li/ul/li/ul/div/div
/navdivdiv classcontainerdiv stylemargin-bottom: 10pxa classbtn btn-success href#span classglyphicon glyphicon-plus-sign aria-hiddentrue/span新建/a/divdiv classbs-example data-example-idpanel-without-body-with-tablediv classpanel panel-default!-- Default panel contents --div classpanel-headingspan classglyphicon glyphicon-th-list aria-hiddentrue/span部门列表/div!-- Table --table classtable table-borderedtheadtrth序号/thth名称/thth操作/th/tr/theadtbody{% for obj in depart_set %}trth scoperow{{ obj.id }}/thtd{{ obj.name }}/tdtda classbtn btn-primary btn-xs编辑/aa classbtn btn-danger btn-xs删除/a/td/tr{% endfor %}/tbody/table/div/div/div
/divscript src{% static js/jquery-3.6.3.min.js %}/script
script src{% static plugins/bootstrap-3.4.1/js/bootstrap.js %}/script
/body
/html 数据从数据库里做几个后续新增就可以实现页面新增 2、实现新增部门页面
url注册
DjangoDemoOne URL ConfigurationThe urlpatterns list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views1. Add an import: from my_app import views2. Add a URL to urlpatterns: path(, views.home, namehome)
Class-based views1. Add an import: from other_app.views import Home2. Add a URL to urlpatterns: path(, Home.as_view(), namehome)
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns: path(blog/, include(blog.urls))from django.contrib import admin
from django.urls import path
from TestManagementSystem import viewsurlpatterns [# path(admin/, admin.site.urls),path(depart/list/, views.depart_list),path(depart/add/, views.depart_add),
]新增depart_add.html页面
{% load static %}
!DOCTYPE html
html langen
headmeta charsetUTF-8title部门列表/titlelink relstylesheet href{% static plugins/bootstrap-3.4.1/css/bootstrap.min.css %}//head
bodynav classnavbar navbar-defaultdiv classcontainer !-- div classcontainer-fluid --div classnavbar-headerbutton typebutton classnavbar-toggle collapsed data-togglecollapsedata-target#bs-example-navbar-collapse-1 aria-expandedfalsespan classsr-onlyToggle navigation/spanspan classicon-bar/spanspan classicon-bar/spanspan classicon-bar/span/buttona classnavbar-brand href#测试管理系统/a/divdiv classcollapse navbar-collapse idbs-example-navbar-collapse-1ul classnav navbar-navlia href/depart/list/部门管理/a/lilia href#Link/a/li/ulul classnav navbar-nav navbar-rightlia href#登录/a/lili classdropdowna href# classdropdown-toggle data-toggledropdown rolebutton aria-haspopuptruearia-expandedfalse春天的菠菜 span classcaret/span/aul classdropdown-menulia href#个人资料/a/lilia href#我的信息/a/lili roleseparator classdivider/lilia href#注销/a/li/ul/li/ul/div/div
/navdivdiv classcontainerdiv stylemargin-bottom: 10pxa classbtn btn-success href/depart/add/span classglyphicon glyphicon-plus-sign aria-hiddentrue/span新建/a/divdiv classbs-example data-example-idpanel-without-body-with-tablediv classpanel panel-default!-- Default panel contents --div classpanel-headingspan classglyphicon glyphicon-th-list aria-hiddentrue/span部门列表/div!-- Table --table classtable table-borderedtheadtrth序号/thth名称/thth操作/th/tr/theadtbody{% for obj in depart_set %}trth scoperow{{ obj.id }}/thtd{{ obj.name }}/tdtda classbtn btn-primary btn-xs编辑/aa classbtn btn-danger btn-xs删除/a/td/tr{% endfor %}/tbody/table/div/div/div
/divscript src{% static js/jquery-3.6.3.min.js %}/script
script src{% static plugins/bootstrap-3.4.1/js/bootstrap.js %}/script
/body
/html
depart_list新增链接到depart_add页面
{% load static %}
!DOCTYPE html
html langen
headmeta charsetUTF-8title部门列表/titlelink relstylesheet href{% static plugins/bootstrap-3.4.1/css/bootstrap.min.css %}//head
bodynav classnavbar navbar-defaultdiv classcontainer !-- div classcontainer-fluid --div classnavbar-headerbutton typebutton classnavbar-toggle collapsed data-togglecollapsedata-target#bs-example-navbar-collapse-1 aria-expandedfalsespan classsr-onlyToggle navigation/spanspan classicon-bar/spanspan classicon-bar/spanspan classicon-bar/span/buttona classnavbar-brand href#测试管理系统/a/divdiv classcollapse navbar-collapse idbs-example-navbar-collapse-1ul classnav navbar-navlia href/depart/list/部门管理/a/lilia href#Link/a/li/ulul classnav navbar-nav navbar-rightlia href#登录/a/lili classdropdowna href# classdropdown-toggle data-toggledropdown rolebutton aria-haspopuptruearia-expandedfalse春天的菠菜 span classcaret/span/aul classdropdown-menulia href#个人资料/a/lilia href#我的信息/a/lili roleseparator classdivider/lilia href#注销/a/li/ul/li/ul/div/div
/navdivdiv classcontainerdiv stylemargin-bottom: 10pxa classbtn btn-success href/depart/add/span classglyphicon glyphicon-plus-sign aria-hiddentrue/span新建/a/divdiv classbs-example data-example-idpanel-without-body-with-tablediv classpanel panel-default!-- Default panel contents --div classpanel-headingspan classglyphicon glyphicon-th-list aria-hiddentrue/span部门列表/div!-- Table --table classtable table-borderedtheadtrth序号/thth名称/thth操作/th/tr/theadtbody{% for obj in depart_set %}trth scoperow{{ obj.id }}/thtd{{ obj.name }}/tdtda classbtn btn-primary btn-xs编辑/aa classbtn btn-danger btn-xs删除/a/td/tr{% endfor %}/tbody/table/div/div/div
/divscript src{% static js/jquery-3.6.3.min.js %}/script
script src{% static plugins/bootstrap-3.4.1/js/bootstrap.js %}/script
/body
/html
views新增depart_add方法
from django.shortcuts import render, redirect, HttpResponse
from TestManagementSystem import models
# Create your views here.def depart_list(request):部门列表# 查询所有部门depart_set models.Department.objects.all()return render(request, depart_list.html, {depart_set: depart_set})def depart_add(request):新增部门# 新增部门 # return HttpResponse(成功)if request.method GET:return render(request, depart_add.html)depart_name request.POST.get(departname)models.Department.objects.create(namedepart_name)return redirect(/depart/list)3、实现删除部门
url注册
DjangoDemoOne URL ConfigurationThe urlpatterns list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views1. Add an import: from my_app import views2. Add a URL to urlpatterns: path(, views.home, namehome)
Class-based views1. Add an import: from other_app.views import Home2. Add a URL to urlpatterns: path(, Home.as_view(), namehome)
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns: path(blog/, include(blog.urls))from django.contrib import admin
from django.urls import path
from TestManagementSystem import viewsurlpatterns [# path(admin/, admin.site.urls),path(depart/list/, views.depart_list),path(depart/add/, views.depart_add),path(depart/delete/, views.depart_delete),
]修改depart_list页面的修改删除按钮业务
{% load static %}
!DOCTYPE html
html langen
headmeta charsetUTF-8title部门列表/titlelink relstylesheet href{% static plugins/bootstrap-3.4.1/css/bootstrap.min.css %}//head
bodynav classnavbar navbar-defaultdiv classcontainer !-- div classcontainer-fluid --div classnavbar-headerbutton typebutton classnavbar-toggle collapsed data-togglecollapsedata-target#bs-example-navbar-collapse-1 aria-expandedfalsespan classsr-onlyToggle navigation/spanspan classicon-bar/spanspan classicon-bar/spanspan classicon-bar/span/buttona classnavbar-brand href#测试管理系统/a/divdiv classcollapse navbar-collapse idbs-example-navbar-collapse-1ul classnav navbar-navlia href/depart/list/部门管理/a/lilia href#Link/a/li/ulul classnav navbar-nav navbar-rightlia href#登录/a/lili classdropdowna href# classdropdown-toggle data-toggledropdown rolebutton aria-haspopuptruearia-expandedfalse春天的菠菜 span classcaret/span/aul classdropdown-menulia href#个人资料/a/lilia href#我的信息/a/lili roleseparator classdivider/lilia href#注销/a/li/ul/li/ul/div/div
/navdivdiv classcontainerdiv stylemargin-bottom: 10pxa classbtn btn-success href/depart/add/span classglyphicon glyphicon-plus-sign aria-hiddentrue/span新建/a/divdiv classbs-example data-example-idpanel-without-body-with-tablediv classpanel panel-default!-- Default panel contents --div classpanel-headingspan classglyphicon glyphicon-th-list aria-hiddentrue/span部门列表/div!-- Table --table classtable table-borderedtheadtrth序号/thth名称/thth操作/th/tr/theadtbody{% for obj in depart_set %}trth scoperow{{ obj.id }}/thtd{{ obj.name }}/tdtda classbtn btn-primary btn-xs编辑/aa classbtn btn-danger btn-xs href/depart/delete/?departid{{ obj.id }}删除/a/td/tr{% endfor %}/tbody/table/div/div/div
/divscript src{% static js/jquery-3.6.3.min.js %}/script
script src{% static plugins/bootstrap-3.4.1/js/bootstrap.js %}/script
/body
/html
修改views.py新增depart_delete方法
from django.shortcuts import render, redirect, HttpResponse
from TestManagementSystem import models
# Create your views here.def depart_list(request):部门列表# 查询所有部门depart_set models.Department.objects.all()return render(request, depart_list.html, {depart_set: depart_set})def depart_add(request):新增部门# 新增部门# return HttpResponse(成功)if request.method GET:return render(request, depart_add.html)depart_name request.POST.get(departname)models.Department.objects.create(namedepart_name)return redirect(/depart/list)def depart_delete(request):删除部门depart_id request.GET.get(departid)models.Department.objects.filter(iddepart_id).delete()return redirect(/depart/list)
4、实现部门编辑功能
url注册
DjangoDemoOne URL ConfigurationThe urlpatterns list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views1. Add an import: from my_app import views2. Add a URL to urlpatterns: path(, views.home, namehome)
Class-based views1. Add an import: from other_app.views import Home2. Add a URL to urlpatterns: path(, Home.as_view(), namehome)
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns: path(blog/, include(blog.urls))from django.contrib import admin
from django.urls import path
from TestManagementSystem import viewsurlpatterns [# path(admin/, admin.site.urls),path(depart/list/, views.depart_list),path(depart/add/, views.depart_add),path(depart/delete/, views.depart_delete),path(depart/int:nid/edit/, views.depart_edit),
]修改depart_list编辑页面
{% load static %}
!DOCTYPE html
html langen
headmeta charsetUTF-8title部门列表/titlelink relstylesheet href{% static plugins/bootstrap-3.4.1/css/bootstrap.min.css %}//head
bodynav classnavbar navbar-defaultdiv classcontainer !-- div classcontainer-fluid --div classnavbar-headerbutton typebutton classnavbar-toggle collapsed data-togglecollapsedata-target#bs-example-navbar-collapse-1 aria-expandedfalsespan classsr-onlyToggle navigation/spanspan classicon-bar/spanspan classicon-bar/spanspan classicon-bar/span/buttona classnavbar-brand href#测试管理系统/a/divdiv classcollapse navbar-collapse idbs-example-navbar-collapse-1ul classnav navbar-navlia href/depart/list/部门管理/a/lilia href#Link/a/li/ulul classnav navbar-nav navbar-rightlia href#登录/a/lili classdropdowna href# classdropdown-toggle data-toggledropdown rolebutton aria-haspopuptruearia-expandedfalse春天的菠菜 span classcaret/span/aul classdropdown-menulia href#个人资料/a/lilia href#我的信息/a/lili roleseparator classdivider/lilia href#注销/a/li/ul/li/ul/div/div
/navdivdiv classcontainerdiv stylemargin-bottom: 10pxa classbtn btn-success href/depart/add/span classglyphicon glyphicon-plus-sign aria-hiddentrue/span新建/a/divdiv classbs-example data-example-idpanel-without-body-with-tablediv classpanel panel-default!-- Default panel contents --div classpanel-headingspan classglyphicon glyphicon-th-list aria-hiddentrue/span部门列表/div!-- Table --table classtable table-borderedtheadtrth序号/thth名称/thth操作/th/tr/theadtbody{% for obj in depart_set %}trth scoperow{{ obj.id }}/thtd{{ obj.name }}/tdtda classbtn btn-primary btn-xs href/depart/{{ obj.id }}/edit/编辑/aa classbtn btn-danger btn-xs href/depart/delete/?departid{{ obj.id }}删除/a/td/tr{% endfor %}/tbody/table/div/div/div
/divscript src{% static js/jquery-3.6.3.min.js %}/script
script src{% static plugins/bootstrap-3.4.1/js/bootstrap.js %}/script
/body
/html
views.py新增depart_edit方法
from django.shortcuts import render, redirect, HttpResponse
from TestManagementSystem import models
# Create your views here.def depart_list(request):部门列表# 查询所有部门depart_set models.Department.objects.all()return render(request, depart_list.html, {depart_set: depart_set})def depart_add(request):新增部门# 新增部门# return HttpResponse(成功)if request.method GET:return render(request, depart_add.html)depart_name request.POST.get(departname)models.Department.objects.create(namedepart_name)return redirect(/depart/list)def depart_delete(request):删除部门depart_id request.GET.get(departid)models.Department.objects.filter(iddepart_id).delete()return redirect(/depart/list)def depart_edit(request, nid):编辑部门if request.method GET:row_object models.Department.objects.filter(idnid).first()# print(row_object.id, row_object.name)return render(request, depart_edit.html, {row_object: row_object})# 获取用户提交的部门名称edit_depart_name request.POST.get(departname)# 根据编辑页面用户ID去更新部门的名称models.Department.objects.filter(idnid).update(nameedit_depart_name)return redirect(/depart/list)
新增depart_edit.html页面
{% load static %}
!DOCTYPE html
html langen
headmeta charsetUTF-8title新增部门/titlelink relstylesheet href{% static plugins/bootstrap-3.4.1/css/bootstrap.min.css %}//head
bodynav classnavbar navbar-defaultdiv classcontainer !-- div classcontainer-fluid --div classnavbar-headerbutton typebutton classnavbar-toggle collapsed data-togglecollapsedata-target#bs-example-navbar-collapse-1 aria-expandedfalsespan classsr-onlyToggle navigation/spanspan classicon-bar/spanspan classicon-bar/spanspan classicon-bar/span/buttona classnavbar-brand href#测试管理系统/a/divdiv classcollapse navbar-collapse idbs-example-navbar-collapse-1ul classnav navbar-navlia href/depart/list/部门管理/a/lilia href#Link/a/li/ulul classnav navbar-nav navbar-rightlia href#登录/a/lili classdropdowna href# classdropdown-toggle data-toggledropdown rolebutton aria-haspopuptruearia-expandedfalse春天的菠菜 span classcaret/span/aul classdropdown-menulia href#个人资料/a/lilia href#我的信息/a/lili roleseparator classdivider/lilia href#注销/a/li/ul/li/ul/div/div
/navdivdiv classcontainerdiv classpanel panel-defaultdiv classpanel-headingh3 classpanel-title新增部门/h3/divdiv classpanel-bodyform methodpost{% csrf_token %}div classform-grouplabel部门名称/labelinput typetext classform-control placeholder部门名称 namedepartname/divbutton typesubmit classbtn btn-primary保 存/button/form/div/div/div
/div/body
/html 修改后的值 七、模版的继承
#模版块
{% block content %}{% endblock %}
1、创建模板layout.html
1将公共的部分写进模版
{% load static %}
!DOCTYPE html
html langen
headmeta charsetUTF-8{% block title %}{% endblock %}link relstylesheet href{% static plugins/bootstrap-3.4.1/css/bootstrap.min.css %}/style.navbar{border-radius: 0;}/style
/head
bodynav classnavbar navbar-defaultdiv classcontainer !-- div classcontainer-fluid --div classnavbar-headerbutton typebutton classnavbar-toggle collapsed data-togglecollapsedata-target#bs-example-navbar-collapse-1 aria-expandedfalsespan classsr-onlyToggle navigation/spanspan classicon-bar/spanspan classicon-bar/spanspan classicon-bar/span/buttona classnavbar-brand href#测试管理系统/a/divdiv classcollapse navbar-collapse idbs-example-navbar-collapse-1ul classnav navbar-navlia href/depart/list/部门管理/a/lilia href#Link/a/li/ulul classnav navbar-nav navbar-rightlia href#登录/a/lili classdropdowna href# classdropdown-toggle data-toggledropdown rolebutton aria-haspopuptruearia-expandedfalse春天的菠菜 span classcaret/span/aul classdropdown-menulia href#个人资料/a/lilia href#我的信息/a/lili roleseparator classdivider/lilia href#注销/a/li/ul/li/ul/div/div
/navdiv{% block content %}{% endblock %}/divscript src{% static js/jquery-3.6.3.min.js %}/script
script src{% static plugins/bootstrap-3.4.1/js/bootstrap.js %}/script
/body
/html
2后续新的html页面使用下面方法继承模版
{% extends layout.html %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
2、将depart_list.html页面使用模版重构
{% extends layout.html %}
{% block title %}title部门列表/title
{% endblock %}
{% block content %}div classcontainerdiv stylemargin-bottom: 10pxa classbtn btn-success href/depart/add/span classglyphicon glyphicon-plus-sign aria-hiddentrue/span新建/a/divdiv classbs-example data-example-idpanel-without-body-with-tablediv classpanel panel-default!-- Default panel contents --div classpanel-headingspan classglyphicon glyphicon-th-list aria-hiddentrue/span部门列表/div!-- Table --table classtable table-borderedtheadtrth序号/thth名称/thth操作/th/tr/theadtbody{% for obj in depart_set %}trth scoperow{{ obj.id }}/thtd{{ obj.name }}/tdtda classbtn btn-primary btn-xs href/depart/{{ obj.id }}/edit/编辑/aa classbtn btn-danger btn-xs href/depart/delete/?departid{{ obj.id }}删除/a/td/tr{% endfor %}/tbody/table/div/div/div{% endblock %}
3、将depart_add.html页面重构
{% extends layout.html %}
{% block title %}title新增部门/title
{% endblock %}
{% block content %}div classcontainerdiv classpanel panel-defaultdiv classpanel-headingh3 classpanel-title新增部门/h3/divdiv classpanel-bodyform methodpost{% csrf_token %}div classform-grouplabel部门名称/labelinput typetext classform-control placeholder部门名称 namedepartname/divbutton typesubmit classbtn btn-primary保 存/button/form/div/div/div{% endblock %}4、将depart_edit.html页面重构
{% extends layout.html %}
{% block title %}title编辑部门/title
{% endblock %}
{% block content %}div classcontainerdiv classpanel panel-defaultdiv classpanel-headingh3 classpanel-title编辑部门/h3/divdiv classpanel-bodyform methodpost{% csrf_token %}div classform-grouplabel部门名称/labelinput typetext classform-control placeholder部门名称 namedepartname value{{ row_object.name }}/divbutton typesubmit classbtn btn-primary保 存/button/form/div/div/div
{% endblock %}
八、页面实战-用户管理
1、uri注册
因为和部门管理类似
from django.contrib import admin
from django.urls import path
from TestManagementSystem import viewsurlpatterns [# path(admin/, admin.site.urls),# 部门管理path(depart/list/, views.depart_list),path(depart/add/, views.depart_add),path(depart/delete/, views.depart_delete),path(depart/int:nid/edit/, views.depart_edit),# 用户管理path(user/list/, views.user_list),path(user/add/, views.user_add),path(user/model/form/add/, views.user_model_form_add), # 新方法实现path(user/int:nid/edit/, views.user_edit),path(user/int:nid/delete/, views.user_delete) # 与部门删除方式不一样
]2、views.py
新增类
class UserModelForm(forms.ModelForm) 与def user_model_form_add(request)方法
from django.shortcuts import render, redirect, HttpResponse
from TestManagementSystem import models
from django import forms
# Create your views here.def depart_list(request):部门列表# 查询所有部门print(部门列表)depart_set models.Department.objects.all()return render(request, depart_list.html, {depart_set: depart_set})def depart_add(request):新增部门# 新增部门# return HttpResponse(成功)if request.method GET:return render(request, depart_add.html)depart_name request.POST.get(departname)models.Department.objects.create(namedepart_name)return redirect(/depart/list)def depart_delete(request):删除部门depart_id request.GET.get(departid)models.Department.objects.filter(iddepart_id).delete()return redirect(/depart/list)def depart_edit(request, nid):编辑部门if request.method GET:row_object models.Department.objects.filter(idnid).first()# print(row_object.id, row_object.name)return render(request, depart_edit.html, {row_object: row_object})# 获取用户提交的部门名称edit_depart_name request.POST.get(departname)# 根据编辑页面用户ID去更新部门的名称models.Department.objects.filter(idnid).update(nameedit_depart_name)return redirect(/depart/list)def user_list(request):用户列表# 查询所有用户user_set models.UserInfo.objects.all()for obj in user_set:print(obj.id, obj.name, obj.password, obj.account, obj.create_time.strftime(%Y-%m-%d-%H-%M-%S),obj.get_gender_display(), obj.depart.name)return render(request, user_list.html, {user_set: user_set})def user_add(request):新增用户原始方式if request.method GET:# 这个是为了新增页面动态获取性别context {gender_choices: models.UserInfo.gender_choices,depart_list: models.Department.objects.all()}return render(request, user_add.html, context)user_name request.POST.get(username)password request.POST.get(pwd)age request.POST.get(age)account request.POST.get(ac)create_time request.POST.get(ctime)gender request.POST.get(gd)depart_id request.POST.get(dp)models.UserInfo.objects.create(nameuser_name, passwordpassword,ageage, accountaccount,create_timecreate_time,gendergender, depart_iddepart_id)return redirect(/user/list)class UserModelForm(forms.ModelForm):# 限制姓名的长度至少为3位name forms.CharField(min_length3, label用户名)# password forms.CharField(label密码,validators这里写正则表达式)class Meta:model models.UserInfofields [name, password, age, account, create_time, gender, depart]widgets {name: forms.TextInput(attrs{class: form-control}),password: forms.PasswordInput(attrs{class: form-control}),age: forms.TextInput(attrs{class: form-control}),account: forms.TextInput(attrs{class: form-control}) } # 下方方法更好def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环找到所有插件添加了class: from-controlfor name, field in self.fields.items():field.widget.attrs {class: form-control, placeholder: field.label}def user_model_form_add(request):新增用户ModelForm方式if request.method GET:form UserModelForm()return render(request, user_model_form_add.html, {form: form})# POST 请求提交的数据数据校验form UserModelForm(datarequest.POST)if form.is_valid():# 如果数据合法这里判断的是所有字段不能为空则存储到数据库# models.UserInfo.objects.create(..) 常规存储方式form.save()return redirect(/user/list)# 如果不满足if判断进入到else返回错误信息return render(request, user_model_form_add.html, {form: form})
3、用户列表页面
{% extends layout.html %}
{% block title %}title用户列表/title
{% endblock %}
{% block content %}div classcontainerdiv stylemargin-bottom: 10pxa classbtn btn-success href/user/add/span classglyphicon glyphicon-plus-sign aria-hiddentrue/span新建/aa classbtn btn-success href/user/model/form/add/span classglyphicon glyphicon-plus-sign aria-hiddentrue/span新建(ModelForm方式)/a/divdiv classbs-example data-example-idpanel-without-body-with-tablediv classpanel panel-default!-- Default panel contents --div classpanel-headingspan classglyphicon glyphicon-th-list aria-hiddentrue/span用户列表/div!-- Table --table classtable table-borderedtheadtrth序号/thth姓名/thth密码/thth年龄/thth余额/thth入职时间/thth性别/thth所属部门/thth操作/th/tr/theadtbody{% for obj in user_set %}trth scoperow{{ obj.id }}/thtd{{ obj.name }}/tdtd{{ obj.password }}/tdtd{{ obj.age }}/tdtd{{ obj.account }}/tdtd{{ obj.create_time|date:Y-m-d H:i:s }}/tdtd{{ obj.get_gender_display }}/tdtd{{ obj.depart.name }}/tdtda classbtn btn-primary btn-xs href/user/{{ obj.id }}/edit/编辑/aa classbtn btn-danger btn-xs href/user/{{ obj.id }}/delete/删除/a/td/tr{% endfor %}/tbody/table/div/div/div{% endblock %}
4、添加用户user_add.html--- 老方法
{% extends layout.html %}
{% block title %}title新增用户/title
{% endblock %}
{% block content %}div classcontainerdiv classpanel panel-defaultdiv classpanel-headingh3 classpanel-title新增用户/h3/divdiv classpanel-bodyform methodpost{% csrf_token %}div classform-grouplabel姓名/labelinput typetext classform-control placeholder姓名 nameusername/divdiv classform-grouplabel密码/labelinput typetext classform-control placeholder密码 namepwd/divdiv classform-grouplabel年龄/labelinput typetext classform-control placeholder年龄 nameage/divdiv classform-grouplabel余额/labelinput typetext classform-control placeholder余额 nameac/divdiv classform-grouplabel入职时间/labelinput typetext classform-control placeholder入职时间 namectime/divdiv classform-grouplabel性别/labelselect classform-control namegd{% for item in gender_choices %}option value{{ item.0 }}{{ item.1 }}/option{% endfor %}!--option value1男/optionoption value2女/option --/select/divdiv classform-grouplabel所属部门/labelselect classform-control namedp{% for item in depart_list %}option value{{ item.id }}{{ item.name }}/option{% endfor %}/select/divbutton typesubmit classbtn btn-primary保 存/button/form/div/div/div{% endblock %}
5、添加用户user_model_form_add.html--- 新方法ModelForm
修改model.py {% extends layout.html %}
{% block title %}title新增用户(ModelForm)/title
{% endblock %}
{% block content %}div classcontainerdiv classpanel panel-defaultdiv classpanel-headingh3 classpanel-title新增用户/h3/divdiv classpanel-bodyform methodpost novalidate{% csrf_token %}{% for field in form %}div classform-grouplabel{{ field.label }}/label{{ field }}span stylecolor: red{{ field.errors.0 }}/span/div{% endfor %}button typesubmit classbtn btn-primary保 存/button/form/div/div/div{% endblock %}6、解决提示英文问题
修改settings.py 7、编辑用户 -新增user_edit.html页面
新增user_edit.html页面url前面全部配置好了
{% extends layout.html %}
{% block title %}title编辑用户/title
{% endblock %}
{% block content %}div classcontainerdiv classpanel panel-defaultdiv classpanel-headingh3 classpanel-title编辑用户/h3/divdiv classpanel-bodyform methodpost novalidate{% csrf_token %}{% for field in form %}div classform-grouplabel{{ field.label }}/label{{ field }}span stylecolor: red{{ field.errors.0 }}/span/div{% endfor %}button typesubmit classbtn btn-primary保 存/button/form/div/div/div
{% endblock %}
8、编辑用户 -修改views.py
from django.shortcuts import render, redirect, HttpResponse
from TestManagementSystem import models
from django import forms
# Create your views here.def depart_list(request):部门列表# 查询所有部门print(部门列表)depart_set models.Department.objects.all()return render(request, depart_list.html, {depart_set: depart_set})def depart_add(request):新增部门# 新增部门# return HttpResponse(成功)if request.method GET:return render(request, depart_add.html)depart_name request.POST.get(departname)models.Department.objects.create(namedepart_name)return redirect(/depart/list)def depart_delete(request):删除部门depart_id request.GET.get(departid)models.Department.objects.filter(iddepart_id).delete()return redirect(/depart/list)def depart_edit(request, nid):编辑部门if request.method GET:row_object models.Department.objects.filter(idnid).first()# print(row_object.id, row_object.name)return render(request, depart_edit.html, {row_object: row_object})# 获取用户提交的部门名称edit_depart_name request.POST.get(departname)# 根据编辑页面用户ID去更新部门的名称models.Department.objects.filter(idnid).update(nameedit_depart_name)return redirect(/depart/list)def user_list(request):用户列表# 查询所有用户user_set models.UserInfo.objects.all()for obj in user_set:print(obj.id, obj.name, obj.password, obj.account, obj.create_time.strftime(%Y-%m-%d-%H-%M-%S),obj.get_gender_display(), obj.depart.name)return render(request, user_list.html, {user_set: user_set})def user_add(request):新增用户原始方式if request.method GET:# 这个是为了新增页面动态获取性别context {gender_choices: models.UserInfo.gender_choices,depart_list: models.Department.objects.all()}return render(request, user_add.html, context)user_name request.POST.get(username)password request.POST.get(pwd)age request.POST.get(age)account request.POST.get(ac)create_time request.POST.get(ctime)gender request.POST.get(gd)depart_id request.POST.get(dp)models.UserInfo.objects.create(nameuser_name, passwordpassword,ageage, accountaccount,create_timecreate_time,gendergender, depart_iddepart_id)return redirect(/user/list)class UserModelForm(forms.ModelForm):# 限制姓名的长度至少为3位name forms.CharField(min_length3, label用户名)# password forms.CharField(label密码,validators这里写正则表达式)class Meta:model models.UserInfofields [name, password, age, account, create_time, gender, depart]widgets {name: forms.TextInput(attrs{class: form-control}),password: forms.PasswordInput(attrs{class: form-control}),age: forms.TextInput(attrs{class: form-control}),account: forms.TextInput(attrs{class: form-control}) } # 下方方法更好def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环找到所有插件添加了class: from-controlfor name, field in self.fields.items():field.widget.attrs {class: form-control, placeholder: field.label}def user_model_form_add(request):新增用户ModelForm方式if request.method GET:form UserModelForm()return render(request, user_model_form_add.html, {form: form})# POST 请求提交的数据数据校验form UserModelForm(datarequest.POST)if form.is_valid():# 如果数据合法这里判断的是所有字段不能为空则存储到数据库# models.UserInfo.objects.create(..) 常规存储方式form.save()return redirect(/user/list)# 如果不满足if判断进入到else返回错误信息return render(request, user_model_form_add.html, {form: form})def user_edit(request, nid):编辑用户# 根据nid去数据库获取所在行数据row_object models.UserInfo.objects.filter(idnid).first()if request.method GET: form UserModelForm(instancerow_object)return render(request, user_edit.html, {form: form})# POST 请求提交的数据数据校验 form UserModelForm(datarequest.POST, instancerow_object)if form.is_valid():# 如果数据合法这里判断的是所有字段不能为空则存储到数据库# models.UserInfo.objects.create(..) 常规存储方式# form.instance.字段名值 # 如果需要存储用户输入之外的值使用这个form.save()return redirect(/user/list)# 如果不满足if判断进入到else返回错误信息return render(request, user_edit.html, {form: form})
9、修改数据库入职时间为年月日格式 执行命令
python manage.py makemigrations
python manage.py migrate
修改user_list.html,删除红色方框 10、删除用户在views.py新增user_delete方法
from django.shortcuts import render, redirect, HttpResponse
from TestManagementSystem import models
from django import forms
# Create your views here.def depart_list(request):部门列表# 查询所有部门print(部门列表)depart_set models.Department.objects.all()return render(request, depart_list.html, {depart_set: depart_set})def depart_add(request):新增部门# 新增部门# return HttpResponse(成功)if request.method GET:return render(request, depart_add.html)depart_name request.POST.get(departname)models.Department.objects.create(namedepart_name)return redirect(/depart/list)def depart_delete(request):删除部门depart_id request.GET.get(departid)models.Department.objects.filter(iddepart_id).delete()return redirect(/depart/list)def depart_edit(request, nid):编辑部门if request.method GET:row_object models.Department.objects.filter(idnid).first()# print(row_object.id, row_object.name)return render(request, depart_edit.html, {row_object: row_object})# 获取用户提交的部门名称edit_depart_name request.POST.get(departname)# 根据编辑页面用户ID去更新部门的名称models.Department.objects.filter(idnid).update(nameedit_depart_name)return redirect(/depart/list)def user_list(request):用户列表# 查询所有用户user_set models.UserInfo.objects.all()for obj in user_set:print(obj.id, obj.name, obj.password, obj.account, obj.create_time.strftime(%Y-%m-%d-%H-%M-%S),obj.get_gender_display(), obj.depart.name)return render(request, user_list.html, {user_set: user_set})def user_add(request):新增用户原始方式if request.method GET:# 这个是为了新增页面动态获取性别context {gender_choices: models.UserInfo.gender_choices,depart_list: models.Department.objects.all()}return render(request, user_add.html, context)user_name request.POST.get(username)password request.POST.get(pwd)age request.POST.get(age)account request.POST.get(ac)create_time request.POST.get(ctime)gender request.POST.get(gd)depart_id request.POST.get(dp)models.UserInfo.objects.create(nameuser_name, passwordpassword,ageage, accountaccount,create_timecreate_time,gendergender, depart_iddepart_id)return redirect(/user/list)class UserModelForm(forms.ModelForm):# 限制姓名的长度至少为3位name forms.CharField(min_length3, label用户名)# password forms.CharField(label密码,validators这里写正则表达式)class Meta:model models.UserInfofields [name, password, age, account, create_time, gender, depart]widgets {name: forms.TextInput(attrs{class: form-control}),password: forms.PasswordInput(attrs{class: form-control}),age: forms.TextInput(attrs{class: form-control}),account: forms.TextInput(attrs{class: form-control}) } # 下方方法更好def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环找到所有插件添加了class: from-controlfor name, field in self.fields.items():field.widget.attrs {class: form-control, placeholder: field.label}def user_model_form_add(request):新增用户ModelForm方式if request.method GET:form UserModelForm()return render(request, user_model_form_add.html, {form: form})# POST 请求提交的数据数据校验form UserModelForm(datarequest.POST)if form.is_valid():# 如果数据合法这里判断的是所有字段不能为空则存储到数据库# models.UserInfo.objects.create(..) 常规存储方式form.save()return redirect(/user/list)# 如果不满足if判断进入到else返回错误信息return render(request, user_model_form_add.html, {form: form})def user_edit(request, nid):编辑用户# 根据nid去数据库获取所在行数据row_object models.UserInfo.objects.filter(idnid).first()if request.method GET:form UserModelForm(instancerow_object)return render(request, user_edit.html, {form: form})# POST 请求提交的数据数据校验form UserModelForm(datarequest.POST, instancerow_object)if form.is_valid():# 如果数据合法这里判断的是所有字段不能为空则存储到数据库# models.UserInfo.objects.create(..) 常规存储方式# form.instance.字段名值 # 如果需要存储用户输入之外的值使用这个form.save()return redirect(/user/list)# 如果不满足if判断进入到else返回错误信息return render(request, user_edit.html, {form: form})def user_delete(request, nid):删除用户# 根据nid去数据库获取所在行数据进行删除models.UserInfo.objects.filter(idnid).delete()return redirect(/user/list)
源码下载点我下载