Topic: Employee Management System
1. Create a new project
2. Create an app
python manage.py startapp app01
Click [run manage.py Task], then enter startapp app01
register app
3. Design table structure
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. Generate tables in MySql
4.1 Manually create database db2
Type in terminal
create database db2 default charset utf8 collate utf8_general_ci;
show db2;
use db2;
4.2 The tool connects to the database db2 in MySql
Comment the original databases in the settings.py file, and add the following content:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db2',
'USER': 'root',
'PASSWORD': '12345678',
"HOST": 'localhost',
'PORT': '3306',
}
}
4.3 Django command to generate data table
Type in terminal:
python manage.py makemigrations
python manage.py migrate
Or open [tools] - [run manage.py task], enter
makemigrations
migrate
5. Static file management
6. Department management
Experience first, use the most original method to do it
Form and ModelForm are provided in Django (convenient)
6.1 Department List
/depart/list
/depart/add and /depart/edit
7. Template inheritance
define template 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>
inheritance template
{% extends 'layout.html' %}
{% block content %}
<h1>首页</h1>
{% endblock %}
8 user management
user list/user/list
Create some user data manually first
Type in terminal
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->string
from datetime import datetime
dt = datetime.now()
res = dt.strftime("%Y-%m-%d-%H-%M")
print(res)
Get gender directly
print(obj.get_gender_display)
# 同理,获取任何由choices创建的字段都可以用get_字段名称_display
Get connected department name
print(obj.depart.title)
# 由于部门号depart_id是外键,所以obj.depart就是获取外键的那一行数据
New user/user/add
Original way of thinking: will not adopt (essential) [trouble]
There is no data verification after the user submits the data
If there is an error, there should be an error message
On the page, we need to write every short word
Associated data, manually obtained and cyclically displayed on the page
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 components
Form component (small and simple)
ModelForm component (big and simple)
8.1 Getting to know Form for the first time
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 version user management interface
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 %}
When submitting, an error message in Chinese is displayed
Modify in setting.py:
LANGUAGE_CODE = 'zh-hans'