主题:员工管理系统
1.新建项目

2.创建app
python manage.py startapp app01
点击【run manage.py Task】,然后输入startapp app01


注册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)
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='年龄')
salary = models.DecimalField(verbose_name='账户余额', max_digits=10, decimal_places=2, default=0)
create_time = models.DateTimeField(verbose_name='入职时间')
# 无约束
# depart_id = models.BigIntegerField(verbose_name='部门ID')
# 有约束
# to:与那张表关联
# to_field:与表中的那一列关联
# 2.django自动
# 写的depart,生成数据列,depart_id
# depart = models.ForeignKey(to='Department', to_field='id')
# 3.部门表被删除
# 3.1级联删除
depart = models.ForeignKey(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.CASCADE)
# 在Django中的约束
gender_choices = (
(1, '男'),
(2, '女')
)
gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)
4.在MySql中生成表
4.1手动创建数据库db2
在终端输入
create database db2 default charset utf8 collate utf8_general_ci;
show db2;
use db2;

4.2工具连接MySql中数据库db2
settings.py文件中注释原来的databases,并添加下面内容:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db2',
'USER': 'root',
'PASSWORD': '12345678',
"HOST": 'localhost',
'PORT': '3306',
}
}
4.3Django命令生成数据表
在终端输入:
python manage.py makemigrations
python manage.py migrate
或者打开【tools】-【run manage.py task】,在输入
makemigrations
migrate


5.静态文件管理

6.部门管理
先体验,使用最原始的方法去做
Django中提供Form和ModelForm组建(方便)
6.1部门列表
/depart/list

/depart/add和/depart/edit

7.模板的继承
定义模板layout.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>标题</h1>
<div>
{% block content %}{% endblock %}
</div>
<h1>底部</h1>
</body>
</html>
继承模板
{% extends 'layout.html' %}
{% block content %}
<h1>首页</h1>
{% endblock %}
8用户管理
用户列表/user/list
先手动创建一些用户数据
在终端输入
insert into app01_userinfo(name, password, age, salary, create_time, gender, depart_id) values('qy', '123', 21, 1000.68, '2022-12-15', 2, 1);
insert into app01_userinfo(name, password, age, salary, create_time, gender, depart_id) values('haha', '123', 22, 2000.68, '2021-12-15', 1, 2);
insert into app01_userinfo(name, password, age, salary, create_time, gender, depart_id) values('hello', '123', 26, 6600.68, '2018-12-15', 1, 5);
insert into app01_userinfo(name, password, age, salary, create_time, gender, depart_id) values('world', '123', 24, 4000.68, '2020-12-15', 2, 3);
mysql> select * from app01_userinfo;
+----+-------+----------+-----+---------+----------------------------+--------+-----------+
| id | name | password | age | salary | create_time | gender | depart_id |
+----+-------+----------+-----+---------+----------------------------+--------+-----------+
| 1 | qy | 123 | 21 | 1000.68 | 2022-12-15 00:00:00.000000 | 2 | 1 |
| 2 | haha | 123 | 22 | 2000.68 | 2021-12-15 00:00:00.000000 | 1 | 2 |
| 3 | hello | 123 | 26 | 6600.68 | 2018-12-15 00:00:00.000000 | 1 | 5 |
| 4 | world | 123 | 24 | 4000.68 | 2020-12-15 00:00:00.000000 | 2 | 3 |
+----+-------+----------+-----+---------+----------------------------+--------+-----------+
4 rows in set (0.00 sec)
datetime->字符串
from datetime import datetime
dt = datetime.now()
res = dt.strftime("%Y-%m-%d-%H-%M")
print(res)
直接获取gender
print(obj.get_gender_display)
# 同理,获取任何由choices创建的字段都可以用get_字段名称_display
获取连接的部门名称
print(obj.depart.title)
# 由于部门号depart_id是外键,所以obj.depart就是获取外键的那一行数据
新建用户/user/add
原始方式理思路:不会采用(本质)【麻烦】
用户提交数据后没有数据校验
如果出现错误,应该有错误提示
页面上,每一个字短都需要我们写一遍
关联的数据,手动去获取并循环展示在页面
def user_add(request):
""" 添加用户 """
context = {
'gender_choice': UserInfo.gender_choices,
'depart_list': Department.objects.all(),
}
if request.method == 'GET':
return render(request, 'user_add.html', context)
user = request.POST.get("user")
password = request.POST.get("pwd")
age = request.POST.get("age")
salary = request.POST.get("sl")
create_time = request.POST.get("ctime")
gender_id = request.POST.get("gd")
depart_id = request.POST.get("dp")
# 添加到数据库
UserInfo.objects.create(name=user, password=password, age=age, salary=salary, create_time=create_time,
gender=gender_id, depart_id=depart_id)
return redirect("/user/list/")
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">新建用户</div>
<div class="panel-body">
<form method="post">
{% 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="password" 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="sl">
</div>
<div class="form-group">
<label >入职时间</label>
<input type="date" class="form-control" placeholder="入职时间" name="ctime">
</div>
<div class="form-group">
<label >性 别</label>
<select class="form-control" name="gd">
{% for item in gender_choice %}
<option value="{{ item.0 }}">{{ item.1 }}</option>
{% 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>
{% endfor %}
</select>
</div>
<button type="submit" class="btn btn-success">提交</button>
</form>
</div>
</div>
</div>
{% endblock %}
Django组件
Form组件(小简便)
ModelForm组件(大简便)
8.1初识Form
1.views.py
class MyForm(Form):
user = forms.charField(widget=forms.Input)
pwd = forms.charField(widget=forms.Input)
email = forms.charField(widget=forms.Input)
def user_add(request):
""" 添加用户 """
if request.method == 'GET':
form = MyForm()
return render(request, 'user_add.html', {'form':form})
2.user_add.html
<form method='post'>
{% for field in form %}
{{field}}
{% endfor %}
</form>
8.3ModelForm
0.model.py
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='年龄')
salary = models.DecimalField(verbose_name='账户余额', max_digits=10, decimal_places=2, default=0)
create_time = models.DateTimeField(verbose_name='入职时间')
# 3.1级联删除
depart = models.ForeignKey(to='Department', to_field='id', on_delete=models.CASCADE)
# 在Django中的约束
gender_choices = (
(1, '男'),
(2, '女')
)
gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)
1.views.py
class MyForm(Form):
class Meta:
model = UserInfo
field = ['name', 'password', 'age']
def user_add(request):
""" 添加用户 """
if request.method == 'GET':
form = MyForm()
return render(request, 'user_add.html', {'form':form})
2.user_add.html
<form method='post'>
{% for field in form %}
{{field}}
{% endfor %}
</form>
8.4ModelForm版用户管理界面
views.py
from django import forms
class UserModelForm(forms.ModelForm):
# name = forms.CharField(max_length=3, label="用户名")
class Meta:
model = UserInfo
fields = ['name', 'password', 'age', 'salary', 'create_time',
'gender', 'depart']
widgets = {
# 'name': forms.TextInput(attrs={"class": 'form-control'}),
'password': forms.PasswordInput,
'create_time': forms.DateTimeInput,
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 循环找到所有的插件
for name, field in self.fields.items():
print(name, field)
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(data=request.POST)
# 如果数据合法,将数据添加到数据库
if form.is_valid():
# print(form.cleaned_data)
form.save()
return redirect('/user/list/')
# 校验失败,在页面显示错误信息
# print(form.errors)
return render(request, 'user_model_form_add.html', {'form': form})
user_model_form_add.html
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">新建用户</div>
<div class="panel-body">
<form method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label >{{ field.label }}:</label>
{{ field }}
<span style="color: red">{{ field.errors.0 }}</span>
</div>
{% endfor %}
<button type="submit" class="btn btn-success">提交</button>
</form>
</div>
</div>
</div>
{% endblock %}
提交时,显示中文的错误信息
在setting.py中修改:

LANGUAGE_CODE = 'zh-hans'