1.新建项目
选择一个文件夹
右键
pycharm打开
选择一个编译器
2.创建app并注册
python manage.py startapp employees
回车,等待或者刷新或者重启pycharm即可
右键
注册app
3.设计表结构
models.py
from django.db import models
# Create your models here.
class Department(models.Model):
""" 部门表 """
title = models.CharField(verbose_name='标题', max_length=32)
def __str__(self):
return self.title
class UserInfo(models.Model):
""" 员工表 """
name = models.CharField(verbose_name="姓名", max_length=16)
password = models.CharField(verbose_name="密码", max_length=64)
age = models.IntegerField(verbose_name="年龄")
account = models.DecimalField(verbose_name="账户余额", max_digits=10, decimal_places=2, default=0)
create_time = models.DateTimeField(verbose_name="入职时间", auto_now_add=True)
depart = models.ForeignKey(to="Department", to_field="id", on_delete=models.CASCADE)
# 置空
# 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)
4.在数据库中生成表格
手动创建数据库
create database Employees DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
修改setting.py,连接mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'Employees', # 数据库名字
'USER': 'root',
'PASSWORD': '949296', # 你的MySQL密码
'HOST': '127.0.0.1', # 本机
'PORT': 3306,
}
}
依次输入下面命令
python manage.py makemigrations
python manage.py migrate
在mysql中查看结果,创建成功
5.静态文件 & 模板文件
在employees目录下放入我们的静态文件目录
我的静态文件连接:
通过百度网盘分享的文件:static
链接: https://pan.baidu.com/s/1bjyjbzT_QjIFgzx3YfT6Ig?pwd=xw7n 提取码: xw7n
在employees目录下创建templates目录作为模板文件存放的地方
6.部门管理(使用ModelForm)
实现目标:部门列表(查)、添加部门(增)、编辑部门(改)、删除部门(删)
编写urls.py文件和views.py文件,两者逻辑一一对应(每一个url都对应一个视图函数),注意不要忘记导入对应的库
DepartmentModelForm(自己命名)是使用ModelForm是需要定义的一个类
还要编写html文件,由于几个功能都用到了相同的导航条,所以我编写了模板html,然后让让不同功能的来继承模板
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap-5.3.3/css/bootstrap.css' %}">
<link rel="stylesheet" href="{% static 'plugins/font-awesome-4.7.0/css/font-awesome.css' %}">
<style>
.c1{
margin-top: 20px;
margin-bottom: 20px;
}
</style>
</head>
<body>
<nav class="navbar navbar-expand-lg bg-light">
<div class="container">
<a class="navbar-brand" href="#">三体管理系统</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="/depart/list/">部门管理</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/user/list/">用户管理</a>
</li>
<form class="d-flex">
<input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success" type="submit">Search</button>
</form>
</ul>
</div>
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">登录</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">注册</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="log" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
豆腐乳
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="#">个人资料</a></li>
<li><a class="dropdown-item" href="#">我的账户</a></li>
<li><a class="dropdown-item" href="#">修改密码</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="#">注销</a></li>
</ul>
</li>
</ul>
</div>
</nav>
<div>
{% block content %}{% endblock %}
</div>
<script src="{% static 'plugins/bootstrap-5.3.3/js/bootstrap.bundle.min.js' %}"></script>
</body>
</html>
depart_list.html(部门列表,包含删除部门的功能按钮)、depart_add.html(添加部门)、depart_edit.html(编辑部门) 这三个都继承layout.html
depart_list.html:
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div class="c1">
<a class="btn btn-success" href="/depart/add">新建部门</a>
</div>
<div class="card c1">
<div class="card-header">
<i class="fa fa-list" aria-hidden="true"></i>
部门列表
</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-striped table-bordered table-hover mb-0">
<thead>
<tr>
<th>ID</th>
<th>名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for obj in queryset %}
<tr>
<th scope="row">{{ obj.id }}</th>
<td>{{ obj.title }}</td>
<td>
<a class="btn btn-primary btn-xs" href="/depart/{{ obj.id }}/edit/">编辑</a>
<a class="btn btn-danger btn-xs" href="/depart/{{ obj.id }}/delete/">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
{% endblock %}
效果
depart_add.html:
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div class="c1">
<a class="btn btn-success" href="/depart/add">新建部门</a>
</div>
<div class="card c1">
<div class="card-header">
新建部门
</div>
<div class="card-body">
<form method="post" novalidate>
{% csrf_token %}
{% for field in form%}
<div class="form-label">
<label>{{ field.label }}</label>
{{ field }}
<span style="color: red;">{{ field.errors.0 }}</span>
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">提交</button>
</form>
</div>
</div>
</div>
{% endblock %}
效果,输入部门名称,点击提交,就会新增部门
depart_edit.html:
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div class="card c1">
<div class="card-header">
修改部门
</div>
<div class="card-body">
<form method="post" novalidate>
{% csrf_token %}
{% for field in form%}
<div class="form-label">
<label>{{ field.label }}</label>
{{ field }}
<span style="color: red;">{{ field.errors.0 }}</span>
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">提交</button>
</form>
</div>
</div>
</div>
{% endblock %}
效果,点击
点提交就会被修改
点击删除,这个部门就会被删除
7.用户管理(使用ModelForm)
思路和部门管理一样,只是将对象从部门换成了用户
同部门管理一样,使用同一个模板HTML继承
user_list.html:
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div class="c1">
<a class="btn btn-success" href="/user/add">新建用户</a>
</div>
<div class="card c1">
<div class="card-header">
<i class="fa fa-list" aria-hidden="true"></i>
用户列表
</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-striped table-bordered table-hover mb-0">
<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 scope="row">{{ 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>
<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>
</div>
</div>
{% endblock %}
效果
user_add.html:
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div class="c1">
<a class="btn btn-success" href="/user/add">新建用户</a>
</div>
<div class="card c1">
<div class="card-header">
新建用户
</div>
<div class="card-body">
<form method="post" novalidate>
{% csrf_token %}
{% for field in form%}
<div class="form-label">
<label>{{ field.label }}</label>
{{ field }}
<span style="color: red;">{{ field.errors.0 }}</span>
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">提交</button>
</form>
</div>
</div>
</div>
{% endblock %}
效果,点击
填写数据,提交
user_edit.html:
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div class="c1">
<a class="btn btn-success" href="/user/edit">编辑用户</a>
</div>
<div class="card c1">
<div class="card-header">
编辑用户
</div>
<div class="card-body">
<form method="post" novalidate>
{% csrf_token %}
{% for field in form%}
<div class="form-label">
<label>{{ field.label }}</label>
{{ field }}
<span style="color: red;">{{ field.errors.0 }}</span>
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">提交</button>
</form>
</div>
</div>
</div>
{% endblock %}
效果,点击编辑
修改用户名
提交,修改成功
如果点击删除,效果如下
8.部门和用户管理的urls.py和views.py中的完整代码
urls.py
from django.urls import path
from employees import views
urlpatterns = [
#path("admin/", admin.site.urls),
path("depart/list/", views.depart_list),
path("depart/add/", views.depart_add),
path("depart/<int:nid>/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/<int:nid>/edit/", views.user_edit),
path("user/<int:nid>/delete/", views.user_delete),
]
views.py
from django.shortcuts import render,redirect
from employees import models
from django import forms
from django.core.validators import MinLengthValidator, RegexValidator
def depart_list(request):
queryset = models.Department.objects.all()
return render(request, 'depart_list.html', {"queryset": queryset})
class DepartmentModelForm(forms.ModelForm):
title = forms.CharField(min_length=2)
class Meta:
model = models.Department
fields = ["title"] # 处理 title 字段
def __init__(self, *args, **kwargs):
# 调用父类的初始化方法
super().__init__(*args, **kwargs)
# 遍历表单中的所有字段
for name, field in self.fields.items():
# 为每个字段的 widget 添加 HTML 属性
field.widget.attrs = {
"class": "form-control", # 添加 Bootstrap 样式
"placeholder": field.label # 设置占位符为字段的标签
}
def depart_add(request):
# 处理 GET 请求:显示空表单
if request.method == 'GET':
form = DepartmentModelForm() # 创建一个空的 DepartmentModelForm 实例
# 渲染模板,并将表单对象传递给模板
return render(request, 'depart_add.html', {"form": form})
# 处理 POST 请求:提交表单数据
form = DepartmentModelForm(data=request.POST)
# 验证表单数据是否有效
if form.is_valid():
# 如果数据有效,保存表单数据到数据库
form.save()
return redirect("/depart/list") # 重定向到部门列表页面
else:
# 校验失败,在页面上显示错误信息
return render(request, 'depart_add.html', {"form": form})
def depart_delete(request, nid):
models.Department.objects.filter(id=nid).delete()
return redirect("/depart/list")
def depart_edit(request, nid):
row_object = models.Department.objects.filter(id=nid).first()
if request.method == 'GET':
form = DepartmentModelForm(instance=row_object)
return render(request, 'depart_edit.html', {"form": form})
form = DepartmentModelForm(data=request.POST, instance=row_object)
if form.is_valid():
form.save()
return redirect("/depart/list")
return render(request, 'depart_edit.html', {"form": form})
def user_list(request):
queryset = models.UserInfo.objects.all()
for obj in queryset:
print(obj.get_gender_display())
return render(request, 'user_list.html', {"queryset": queryset})
class UserModelForm(forms.ModelForm):
name = forms.CharField(min_length=2,label="用户名")
password = forms.CharField(
label="密码",
validators=[
MinLengthValidator(6, message="密码长度不能少于 6 个字符。"),
RegexValidator(
regex=r'^(?=.*\d)(?=.*[a-zA-Z]).{6,20}$',
message="密码必须包含字母和数字,且长度为 6-20 个字符。"
)
]
)
class Meta:
model = models.UserInfo
fields = ["name","password","age", "account", "create_time", "gender", "depart"]
def __init__(self, *args, **kwargs):
# 调用父类的初始化方法
super().__init__(*args, **kwargs)
# 遍历表单中的所有字段
for name, field in self.fields.items():
# 为每个字段的 widget 添加 HTML 属性
field.widget.attrs = {
"class": "form-control", # 添加 Bootstrap 样式
"placeholder": field.label # 设置占位符为字段的标签
}
def user_add(request):
# 处理 GET 请求:显示空表单
if request.method == 'GET':
form = UserModelForm() # 创建一个空的 UserModelForm 实例
# 渲染模板,并将表单对象传递给模板
return render(request, 'user_add.html', {"form": form})
# 处理 POST 请求:提交表单数据
form = UserModelForm(data=request.POST)
# 验证表单数据是否有效
if form.is_valid():
# 如果数据有效,保存表单数据到数据库
form.save()
return redirect("/user/list") # 重定向到用户列表页面
else:
# 校验失败,在页面上显示错误信息
return render(request, 'user_add.html', {"form": form})
def user_edit(request, nid):
row_object = models.UserInfo.objects.filter(id=nid).first()
if request.method == 'GET':
form = UserModelForm(instance=row_object)
return render(request, 'user_edit.html', {"form": form})
form = UserModelForm(data=request.POST, instance=row_object)
if form.is_valid():
form.save()
return redirect("/user/list")
return render(request, 'user_edit.html', {"form": form})
def user_delete(request, nid):
models.UserInfo.objects.filter(id=nid).delete()
return redirect("/user/list")
学习:【最新Python的web开发全家桶(django+前端+数据库)-哔哩哔哩】 https://b23.tv/6T6YlnA