一. 在models.py中创建员工表
class UserInfo(models.Model):
""" 员工表 """
name = models.CharField(verbose_name="姓名", max_length=16) # 属性 = 字符串类(表头名,型最大长度16)
password = models.CharField(verbose_name="密码", max_length=64)
age = models.IntegerField(verbose_name="年龄") # 属性 = int类型(表头名)
account = models.DecimalField(verbose_name="账户余额", max_digits=10, decimal_places=2,
default=0) # 属性 = 小数类(表头名,型最大长度10,小数点保留2位,默认为0)
create_time = models.DateTimeField(verbose_name="入职时间") # 属性 = 时间类型(表头名)
# 无约束(id号可以超出与关联表的id号)
# depart_id = models.BigIntegerField(verbose_name="部门ID") # 还要有员工对应的部门这一列
# 1.有约束(id号可以只能与在关联表的id号内)
# - to,与那张表关联
# - to_field,表中的那一列关联
# 2.django自动
# - 写的depart
# - 生成数据列 depart_id
# 3.部门表被删除
# ### 3.1 级联删除 属性=(部门列自动关联另一张表的id列,级联删除)
# depart = models.ForeignKey(verbose_name="部门", to="Department", to_field="id", on_delete=models.CASCADE)
# ### 3.2 置空
depart = models.ForeignKey(to="Department", to_field="id", null=True, blank=True, on_delete=models.SET_NULL)
# 在django中做的约束
gender_choices = (
(1, "男"),
(2, "女"),
)
gender = models.SmallIntegerField(verbose_name="性别", choices=gender_choices) # 属性 = 字符串类(表头名,约束只能选1或2)
二. 在urls.py写url和函数对应关系
urlpatterns = [
# 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),
]
三. 在views.py写函数
def user_list(request):
""" 用户管理 """
# # 获取所有用户列表 [obj,obj,obj] 不加分页
queryset = models.UserInfo.objects.all()
"""
# 用Python的语法获取数据(create_time.strftime("%Y-%m-%d") 把时间转为字符串)(obj.get_gender_display() 直接把元组里数字对应的中文拿到)
for obj in queryset:
print(obj.id, obj.name, obj.account, obj.create_time.strftime("%Y-%m-%d"), obj.gender, obj.get_gender_display(), obj.depart_id, obj.depart.title)
# print(obj.name, obj.depart_id)
# obj.depart_id # 获取数据库中部门表存储的那个字段值(1,2,3,4)
# obj.depart.title # 根据id自动去关联的表中获取哪一行数据depart对象(广告部,宣传部)。
"""
# return render(request, 'user_list.html')
return render(request, 'user_list.html', {"queryset": queryset})
queryset = models.UserInfo.objects.all() # 获取所有用户列表 [obj,obj,obj]
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 = request.POST.get('user') # 获取用户提交的姓名
pwd = request.POST.get('pwd')
age = request.POST.get('age')
account = request.POST.get('ac')
ctime = request.POST.get('ctime')
gender = request.POST.get('gd')
depart_id = request.POST.get('dp')
# 添加到数据库中
models.UserInfo.objects.create(name=user, password=pwd, age=age,
account=account, create_time=ctime,
gender=gender, depart_id=depart_id)
# 返回到用户列表页面
return redirect("/user/list/")
四. 在templates里编写HTML文件
1. 模板文件layout.html
{% load static %} <!-- django引用语法 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}"> <!-- 引用css -->
<style>
.navbar {
border-radius: 0;
}
</style>
{% block css %}{% endblock %}
</head>
<body>
<nav class="navbar navbar-default">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#"> 联通用户管理系统 </a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="/depart/list/">部门管理</a></li>
<li><a href="/user/list/">用户管理</a></li>
<li><a href="/pretty/list/">靓号管理</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="#">登录</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false">武沛齐 <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">个人资料</a></li>
<li><a href="#">我的信息</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">注销</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<div>
{% block content %}{% endblock %} <!-- 模板的占位符 -->
</div>
<script src="{% static 'js/jquery-3.6.0.min.js' %}"></script> <!-- 引用jquery -->
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.min.js' %}"></script> <!-- 引用 js -->
{% block js %}{% endblock %} <!-- 导入时间插件 -->
</body>
</html>
2. 用户列表
{% extends 'layout.html' %} <!-- 继承layout页面 -->
{% block content %} <!-- 导入django模板语法 -->
<div class="container">
<div style="margin-bottom: 10px">
<a class="btn btn-success" href="/user/add/">
<span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
新建用户
</a>
</div>
<div class="panel panel-default">
<!-- 默认面板内容 -->
<div class="panel-heading">
<span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>
用户列表
</div>
<!-- 表头 -->
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>密码</th>
<th>年龄</th>
<th>余额</th>
<th>入职时间</th>
<th>性别</th>
<th>所属部门</th>
<th>操作</th>
</tr>
</thead>
<tbody> <!-- 表头下面的值 -->
{% for obj in queryset %} <!-- 模板语法 循环取值 -->
<tr>
<th>{{ obj.id }}</th>
<td>{{ obj.name }}</td>
<td>{{ obj.password }}</td>
<td>{{ obj.age }}</td>
<td>{{ obj.account }}</td>
<td>{{ obj.create_time|date:"Y-m-d" }}</td> <!-- 模板语法不能加(),把时间转为字符串 -->
<td>{{ obj.get_gender_display }}</td> <!-- 直接把元组里数字对应的中文拿到 -->
<td>{{ obj.depart.title }}</td> <!-- 自动去关联的表中获取哪一行数据depart对象(广告部,宣传部) -->
<td>
<a class="btn btn-primary btn-xs" href="/user/{{ obj.id }}/edit">编辑</a>
<a class="btn btn-danger btn-xs" href="/user/{{ obj.id }}/delete">删除</a>
</td>
</tr>
{% endfor %} <!-- 模板语法 循环结束 -->
</tbody>
</table>
</div>
</div>
{% endblock %} <!-- 模板语法结束 -->
3.添加 用户
{% extends 'layout.html' %} <!--继承html模板 -->
{% block content %} <!-- 导入django模板语 -->
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"> 新建用户 </h3>
</div>
<div class="panel-body">
<form method="post"> <!--提交表单(提交要有name属性:name="user)-->
{% csrf_token %} <!--模板语法测试表单 -->
<div class="form-group">
<label>姓名</label> <!-- 标题 -->
<input type="text" class="form-control" placeholder="姓名" name="user"/>
</div>
<div class="form-group">
<label>密码</label>
<input type="text" class="form-control" placeholder="密码" name="pwd"/>
</div>
<div class="form-group">
<label>年龄</label>
<input type="text" class="form-control" placeholder="年龄" name="age"/>
</div>
<div class="form-group">
<label>余额</label>
<input type="text" class="form-control" placeholder="余额" name="ac"/>
</div>
<div class="form-group">
<label>入职时间</label>
<input id="dt" type="text" class="form-control" placeholder="入职时间" name="ctime"/>
</div>
<div class="form-group">
<label>性别</label> <!-- 标题 -->
<select class="form-control" name="gd"> <!-- 下拉框 -->
{% for item in gender_choices %} <!-- 模板语法循环取出字典的值 -->
<option value="{{ item.0 }}">{{ item.1 }}</option> <!-- item.0=男 -->
{% endfor %} <!-- 模板语法结束 -->
</select>
</div>
<div class="form-group">
<label>部门</label> <!-- 标题 -->
<select class="form-control" name="dp"> <!-- 下拉框 -->
{% for item in depart_list %} <!--模板语法循环取出字典的值 -->
<option value="{{ item.id }}">{{ item.title }}</option> <!-- id=部门 -->
{% endfor %} <!-- 模板语法结束 -->
</select>
</div>
<button type="submit" class="btn btn-primary">提 交</button>
</form>
</div>
</div>
</div>
{% endblock %}