Django开发 员工管理系统(初学,第一天)

 1.新建项目

Django在终端创建项目(pycharm & Windows)-优快云博客文章浏览阅读281次。选择或新建一个文件夹,作为项目保存的地方。 https://blog.youkuaiyun.com/m0_65788436/article/details/145557847?fromshare=blogdetail&sharetype=blogdetail&sharerId=145557847&sharerefer=PC&sharesource=m0_65788436&sharefrom=from_link

选择一个文件夹

右键

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是需要定义的一个类

Django ModelForm使用(初学)-优快云博客文章浏览阅读350次,点赞7次,收藏2次。Django ModelForm使用(初学) https://blog.youkuaiyun.com/m0_65788436/article/details/145658285?fromshare=blogdetail&sharetype=blogdetail&sharerId=145658285&sharerefer=PC&sharesource=m0_65788436&sharefrom=from_link

还要编写html文件,由于几个功能都用到了相同的导航条,所以我编写了模板html,然后让让不同功能的来继承模板

Django html模板的继承-优快云博客文章浏览阅读614次,点赞7次,收藏6次。Django html模板的继承 https://blog.youkuaiyun.com/m0_65788436/article/details/145635574?fromshare=blogdetail&sharetype=blogdetail&sharerId=145635574&sharerefer=PC&sharesource=m0_65788436&sharefrom=from_linklayout.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值