Django-based employee management system 1

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'

Guess you like

Origin blog.csdn.net/qyqyqyi/article/details/128877721