Django学习2-用户管理系统(简单部门管理、用户管理)

目录

1、创建项目和app

1.创建项目

2.创建app

2种创建方式

注册app

2、表结构的创建

Django中的模型字段有很多种,包括但不限于:

设计表结构(Django)

在models.py文件中创建表:部门表和员工表

 加入性别列:在Django中做约束

 代码实现:

3、生成数据库

在MySQL中生成表

通过工具连接MySQL生成数据库

修改配置文件,连接MySQL

表 Django命令生成数据库中的表(前提:已选解释器位置安装了mysqlclient)

4、部门列表展示

静态文件管理

部门管理

部门列表:

5、数据库和部门界面的交互

部门-数据库数据

部门-添加页面(静态)

部门-添加(动态)

部门-删除

部门-编辑

6、数据库与用户界面的交互

模板的继承

用户-列表

用户-添加(原始方法)

Form和ModelForm

原始方法:

Form

ModelForm

用户-添加(ModelForm)

用户-添加和错误提示

编辑用户:

 删除用户

整体代码: 


主题:员工管理系统

1、创建项目和app

1.创建项目

后续 Django命令生成数据库中的表时,发现没有安装mysqlclient,因此更换了解释器的地址为:

D:\software\study software\pycharm\python\python\python.exe

2.创建app

2种创建方式

方式一: 进入文件所在目录的终端,执行python manage.py startapp app01 命令创建 app

方式二:打开这个命令窗口相当于帮助我们执行了python manage.py ,只需输入startapp app01命令即可

注册app

setting.py文件中注册

2、表结构的创建

Django中的模型字段有很多种,包括但不限于:

  • AutoField:自动增长的整数字段。
  • BigAutoField:64位自动增长的整数字段。
  • BigIntegerField:64位整数字段。
  • BinaryField:二进制数据字段。
  • BooleanField:布尔值字段。
  • CharField:字符字段。
  • DateField:日期字段。
  • DateTimeField:日期时间字段。
  • DecimalField:十进制小数字段。
  • DurationField:时间段字段。
  • EmailField:电子邮件地址字段。
  • FileField:文件上传字段。
  • FloatField:浮点数字段。
  • ForeignKey:外键字段。
  • ImageField:图片上传字段。
  • IntegerField:整数字段。
  • JSONField:JSON数据字段。
  • NullBooleanField:可空布尔值字段。
  • PositiveIntegerField:正整数字段。
  • PositiveSmallIntegerField:正小整数字段。
  • SlugField:短标签字段。
  • SmallIntegerField:小整数字段。
  • TextField:文本字段。

设计表结构(Django)

models.py文件中创建表:部门表和员工表

 加入性别列:在Django中做约束

 

 代码实现:

from django.db import models


# Create your models here.
class Department(models.Model):
    """ 部门表 """
    # Django会自动帮我们生成id,并且是自增的,当然也可以自己创建
    # id = models.BigAutoField(verbose_name='ID', primary_key=True)
    # verbose_name注解,可以知道某列代表什么意思
    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='年龄')
    # 最大10位数,小数位占两位,新员工不充值默认是0
    account = 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')

    # 1.有约束
    #   ——to:与哪张表关联, to_field:与表中哪一列关联
    # 2.写的depart,Django内部会自动帮我们 生成depart_id
    # 3.部门表被删除
    #   ——on_delete=models.CASCADE()级联删除,
    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)

3、生成数据库

在MySQL中生成表

ORM只能生成类,不能生成数据库:

通过工具连接MySQL生成数据库

create database gx_day16 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

修改配置文件,连接MySQL

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'gx_day16',  # 数据库名字
        'USER': 'root',
        'PASSWORD': 'Sjf5211314',
        'HOST': '127.0.0.1',  # 哪台机器安装了MySQL(本机)
        'PORT': 3306,
    }
}

表 Django命令生成数据库中的表(前提:已选解释器位置安装了mysqlclient)

python manage.py makemigrations
python manage.py migrate
#另一种直接输入:打开工具——>运行manage.py任务
makemigrations
migrate

表结构创建成功 :

4、部门列表展示

静态文件管理

应该是templates

部门管理

 体验:先用最原始方法来做

 后续:Django中提供Form和ModelForm组件(方便)

部门列表:

大概要实现的界面图

 组件 · Bootstrap v3 中文文档 | Bootstrap 中文网 (bootcss.com)h

depart_list.html的导航参考
depart_list.html的内容部分参考

urls.py:新建一个路径path('depart/add', views.depart_add),

views.py:新建一个视图函数

depart_list.html:静态页面代码实现(借助Bootstrap框架)

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}">
    <style>
        .navbar{
            {#去掉圆角样式#}
            border-radius: 0;
        }
    </style>
</head>
<body>
<nav class="navbar navbar-default">
{#  container-fluid:导航平铺 container:让导航居中 #}
  <div class="container">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">联通用户管理系统</a>
    </div>


    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li><a href="/depart/list">部门管理</a></li>
          <li><a href="#">部门管理</a></li>
      </ul>
      <ul class="nav navbar-nav navbar-right">
        <li><a href="#">登录</a></li>
        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">大炮<span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="#">个人资料</a></li>
            <li><a href="#">我的信息</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">注销Separated link</a></li>
          </ul>
        </li>
      </ul>
    </div>
  </div>
</nav>

{#内容部分#}
<div>
    <div class="container">
        {#按钮#}
        <div style="margin-bottom: 10px">
            <a class="btn btn-success " href="#">
                <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
                新建部门
            </a>
        </div>
        <div class="panel panel-default">
          <!-- Default panel contents -->
          <div class="panel-heading">
              <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>
              部门列表
          </div>

          <!-- Table -->
          <table class="table table-bordered" >
            <thead>
              <tr>
                <th>ID</th>
                <th>名称</th>
                <th>操作</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <th>1</th>
                <td>销售部</td>
                <td>
                    <a class="btn btn-primary btn-xs">编辑</a>
                    <a class="btn btn-danger btn-xs">删除</a>
                </td>
              </tr>
            </tbody>
          </table>
        </div>

    </div>
</div>


<script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.min.js' %}"></script>
</body>
</html>

当前效果图:

html的静态页面,一个导航栏,一个内容的表格,表格中的内容是写死的

5、数据库和部门界面的交互

部门-数据库数据

在终端运行命令:insert into app01_depqrtment(title) values("IT部门"),("销售部");在部门表中添加两个部门

views.py:通过queryset = models.Department.objects.all()获取数据库gx_day16的app01_department中的数据,得到的是QuerySet类型,是一个列表,列表中是一行一行的数据,每一行都是一个对象,对象中封装了id、title等。

depart_list:把部门表中的数据动态加载到前端界面的表格中。

表格中的数据是通过访问部门表得到的,是动态的,会随着部门表的更新而更新。

部门-添加页面(静态)

 depart_add.html:

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}">
    <style>
        .navbar{
            {#去掉圆角样式#}
            border-radius: 0;
        }
    </style>
</head>
<body>
{#导航部分#}
<nav class="navbar navbar-default">
{#  container-fluid:导航平铺 container:让导航居中 #}
  <div class="container">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">联通用户管理系统</a>
    </div>


    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li><a href="/depart/list">部门管理</a></li>
          <li><a href="#">部门管理</a></li>
      </ul>
      <ul class="nav navbar-nav navbar-right">
        <li><a href="#">登录</a></li>
        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">大炮<span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="#">个人资料</a></li>
            <li><a href="#">我的信息</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">注销Separated link</a></li>
          </ul>
        </li>
      </ul>
    </div>
  </div>
</nav>

<div>
    <div class="container">
        <div class="panel panel-default">
          <div class="panel-heading">
            <h3 class="panel-title">新建部门</h3>
          </div>
          <div class="panel-body">
            <form >
               <div class="form-group">
                   <label>标题</label>
                   <input type="text" class="form-control" placeholder="标题" name="title">
               </div>
              <button type="submit" class="btn btn-primary" >提交</button>
            </form>
          </div>
        </div>
    </div>
</div>
<script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.min.js' %}"></script>
</body>
</html>

实现了一个静态的添加界面

部门-添加(动态)

实现点击depart/list界面的新建部门按钮 可以跳转到depart/add界面,然后输入要新建的部门,点击提交,跳转到depart/list界面,并且表格中增加的新建的部门。

views.py:

如果是GET请求,就返回depart_add界面,如果是POST请求,就获取用户提交过来的数据,把数据保存到数据库,然后重定向返回部门列表depart/list.

部门-删除

部门-编辑

实现点击depart/list界面的编辑,可以将对应的id和title传递到终端

 实现在depart/list界面接收传递过来的title,并把其设置为input的默认值

 实现更改后,在原数据上进行更改

截至目前:实现了部门的增删改查

6、数据库与用户界面的交互

模板的继承

部门列表、添加部门、编辑部门中有一些相同的东西,例如导航栏,样式的引入......,如果需要更改相同部分的内容,每个文件里边都要进行修改,相当繁琐。

 模板:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="">
    {% block css %}{% endblock %}
</head>
<body>
    <h1>标题</h1>
    <div>
        {% block content %}{% endblock %}
    </div>
    <h1>底部</h1>


    <script></script>
    {% block js %}{% endblock %}
</body>
</html>

继承模板:

{#继承模板#}
{% extends 'layout.html' %}
{#如果每个页面既有共有的样式也有独有的样式,可以继承共有的,单独写独有的#}
{% block css %}
    <link rel="stylesheet" href="">
    <style>

    </style>
{% endblock %}


{% block content %}
    <h1>首页</h1>
{% endblock %}

{% block js %}
    <script>

    </script>
{% endblock %}

用户-列表

insert  into app01_userinfo(name,password,age,account,create_time,gender,depart_id)values("刘东","123",23,100.68,"2010-11-11",1,2)

  • 时间字段是datetime类型,使用obj.create_time.strftime("%Y-%m-%d")将其转换为字符串类型,并且只保存年月日。

  • 对于性别:数据库中存的是1、2,但是在django中做了如下约束

obj.get_gender_display()来拿到性别 

  • 对于部门obj.depart_id获取数据库中存取的字段的名字,只是数字,obj.depart.title 根据id自动去干关联的表中去获取那一行数据的depart对象

最终实现:

用户-添加(原始方法)

类似与部门列表的添加

user_add.html:

{% extends 'layout.html' %}

{% block content %}

<div class="container">
    <div class="panel panel-default" >
      <div class="panel-heading">
        <h3 class="panel-title">新建用户</h3>
      </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="text" 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="ac">
           </div>
           <div class="form-group">
               <label>入职时间</label>
               <input type="text" class="form-control" placeholder="入职时间" name="ctime">
           </div>
           <div class="form-group">
               <label>性别</label>
               <select class="form-control" name="gd">
{#                   <option value="2">女</option> 写死#}
                   {% for item in gender_choices %}
                       <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-primary" >提交</button>
        </form>

      </div>
    </div>
</div>
{% endblock %}

Form和ModelForm

原始方法:

views.py

def user_add(request):
    """ 添加用户(原始方式)"""
    if request.method == "GET":
        context = {
            'gender_choices': models.UserInfo.gender_choices,
            'depart_list': models.Department.objects.all()
        }
        return render(request, "user_add.html", context)
    # 如果是POST请求,获取用户提交的数据
    user = request.POST.get('user')
    pwd = request.POST.get('pwd')
    age = request.POST.get('age')
    account = request.POST.get('ac')
    ctime = request.POST.get('ctime')
    gender = request.POST.get('gd')
    depart_id = request.POST.get('dp')

    # 添加到数据库
    models.UserInfo.objects.create(name=user, password=pwd,
                                   age=age, account=account, create_time=ctime,
                                   gender=gender, depart_id=depart_id)

    # 返回到用户列表页面
    return redirect("/user/list/")

user_add.html:

{% extends 'layout.html' %}

{% block content %}

<div class="container">
    <div class="panel panel-default" >
      <div class="panel-heading">
        <h3 class="panel-title">新建用户</h3>
      </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="text" 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="ac">
           </div>
           <div class="form-group">
               <label>入职时间</label>
               <input type="text" class="form-control" placeholder="入职时间" name="ctime">
           </div>
           <div class="form-group">
               <label>性别</label>
               <select class="form-control" name="gd">
{#                   <option value="2">女</option> 写死#}
                   {% for item in gender_choices %}
                       <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-primary" >提交</button>
        </form>

      </div>
    </div>
</div>
{% endblock %}

Form

views.py

# myForm类继承django的Form
class MyForm(Form):
    # widget=forms.Input是插件,可以直接在前端页面生成一个输入框
    user = forms.CharField(widget=forms.Input)
    pwd = form.CharFiled(widget=forms.Input)
    email = form.CharFiled(widget=forms.Input)
    account = form.CharFiled(widget=forms.Input)
    create_time = form.CharFiled(widget=forms.Input)
    depart = form.CharFiled(widget=forms.Input)
    gender = form.CharFiled(widget=forms.Input)


def user_add(request):
    if request.method == "GET":
        # 实例化一个对象
        form = MyForm()
        return render(request, 'user_add.html',{"form":form})

user_add.html

```html
<form method="post">
    {% for field in form%}
    	{{ field }}
    {% endfor %}
    <!-- <input type="text"  placeholder="姓名" name="user" /> -->
</form>
```

```html
<form method="post">
    <!-- 会自动生成html标签 <input type="text" class="form-control" placeholder="姓名" name="user"> -->
    {{ form.user }} 
    {{ form.pwd }}
    {{ form.email }}
    <!-- <input type="text"  placeholder="姓名" name="user" /> -->
</form>
```

ModelForm

models.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="年龄")
    account = models.DecimalField(verbose_name="账户余额", max_digits=10, decimal_places=2, default=0)
    create_time = models.DateTimeField(verbose_name="入职时间")
    depart = models.ForeignKey(to="Department", to_field="id", on_delete=models.CASCADE)
    gender_choices = (
        (1, "男"),
        (2, "女"),
    )
    gender = models.SmallIntegerField(verbose_name="性别", choices=gender_choices)

views.py

class MyForm(ModelForm):
    # xx = form.CharField*("...")
    class Meta:
        model = UserInfo
        fields = ["name","password","age","xx"]


def user_add(request):
    if request.method == "GET":
        form = MyForm()
        return render(request, 'user_add.html',{"form":form})

user_add.html


```html
<form method="post">
    {% for field in form%}
    	{{ field }}
    {% endfor %}
    <!-- <input type="text"  placeholder="姓名" name="user" /> -->
</form>
```

```html
<form method="post">
    {{ form.user }}
    {{ form.pwd }}
    {{ form.email }}
    <!-- <input type="text"  placeholder="姓名" name="user" /> -->
</form>
```

用户-添加(ModelForm)

user_model_form_add.html:

{% extends 'layout.html' %}

{% block content %}
    <div class="container">
        <div class="panel panel-default" >
          <div class="panel-heading">
            <h3 class="panel-title">新建用户</h3>
          </div>
          <div class="panel-body">
            <form method="POST">
                {% csrf_token %}
                {% for field in form %}
                   <div class="form-group">
                   <label>{{ field.label }}</label>
                       {{ field }}
               </div>
                {% endfor %}
              <button type="submit" class="btn btn-primary" >提交</button>
            </form>
          </div>
        </div>
    </div>
{% endblock %}

用户-添加和错误提示

编辑用户:

  • - 点击编辑,跳转到编辑页面(将编辑行的ID携带过去)
  • - 编辑页面(默认数据,根据ID获取并设置到页面中)
  • - 提交: 错误提示、数据校验、在数据库更新 

 删除用户

整体代码: 

  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,下面是使用 Django 制作部门门户网站的基本步骤: 1. 确定网站需求和功能:首先需要明确网站的需求和功能,比如展示部门信息、发布公告、上传文件等等。 2. 创建 Django 项目:使用 Django 的命令行工具创建一个新的项目,可以使用 `django-admin startproject projectname` 命令进行创建,其中 `projectname` 是项目名称。 3. 创建 Django 应用:使用 `python manage.py startapp appname` 命令创建一个新的应用,其中 `appname` 是应用名称,比如 `department`。 4. 设计数据库模型:根据网站需求设计数据库模型,使用 Django 自带的 ORM 工具创建对应的模型类,在 `models.py` 文件中进行定义。 5. 创建视图函数:编写视图函数来响应用户请求,并将数据传递给模板进行渲染。可以在 `views.py` 文件中创建视图函数。 6. 创建模板文件:使用 HTML、CSS 和 JavaScript 编写模板文件,将数据渲染到页面中。可以在 `templates` 目录下创建对应的模板文件。 7. 配置 URL:将视图函数和 URL 进行映射,将请求路由到对应的视图函数上。可以在 `urls.py` 文件中进行配置。 8. 进行测试和调试:启动 Django 的开发服务器进行测试和调试,使用 `python manage.py runserver` 命令启动服务器。 9. 部署网站:将部门门户网站部署到服务器上,可以使用第三方工具如 Nginx 和 Gunicorn 进行部署。 以上是制作部门门户网站的基本步骤,需要根据具体需求进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大炮不想学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值