当前位置:   article > 正文

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

django用户管理系统

目录

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中做约束

 

 代码实现:

  1. from django.db import models
  2. # Create your models here.
  3. class Department(models.Model):
  4. """ 部门表 """
  5. # Django会自动帮我们生成id,并且是自增的,当然也可以自己创建
  6. # id = models.BigAutoField(verbose_name='ID', primary_key=True)
  7. # verbose_name注解,可以知道某列代表什么意思
  8. title = models.CharField(verbose_name='标题', max_length=32)
  9. class UserInfo(models.Model):
  10. """ 员工表 """
  11. name = models.CharField(verbose_name='姓名', max_length=16)
  12. password = models.CharField(verbose_name='密码', max_length=64)
  13. age = models.IntegerField(verbose_name='年龄')
  14. # 最大10位数,小数位占两位,新员工不充值默认是0
  15. account = models.DecimalField(verbose_name='账户余额', max_digits=10, decimal_places=2, default=0)
  16. create_time = models.DateTimeField(verbose_name='入职时间')
  17. # 无约束:
  18. # depart_id = models.BigIntegerField(verbose_name='部门ID')
  19. # 1.有约束
  20. # ——to:与哪张表关联, to_field:与表中哪一列关联
  21. # 2.写的depart,Django内部会自动帮我们 生成depart_id
  22. # 3.部门表被删除
  23. # ——on_delete=models.CASCADE()级联删除,
  24. depart = models.ForeignKey(to='Department', to_field='id', on_delete=models.CASCADE)
  25. # ——置空
  26. # depart = models.ForeignKey(to='Department', to_field='id', null=True, blank=True, on_delete=models.SET_NULL)
  27. # 在Django中做约束
  28. gender_choices = (
  29. (1, "男"),
  30. (2, "女")
  31. )
  32. gender = models.SmallIntegerField(verbose_name="性别",choices=gender_choices)

3、生成数据库

在MySQL中生成表

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

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

create database gx_day16 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

修改配置文件,连接MySQL

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

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

  1. python manage.py makemigrations
  2. python manage.py migrate
  3. #另一种直接输入:打开工具——>运行manage.py任务
  4. makemigrations
  5. 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框架)

  1. {% load static %}
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}">
  8. <style>
  9. .navbar{
  10. {#去掉圆角样式#}
  11. border-radius: 0;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. <nav class="navbar navbar-default">
  17. {# container-fluid:导航平铺 container:让导航居中 #}
  18. <div class="container">
  19. <div class="navbar-header">
  20. <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
  21. <span class="sr-only">Toggle navigation</span>
  22. <span class="icon-bar"></span>
  23. <span class="icon-bar"></span>
  24. <span class="icon-bar"></span>
  25. </button>
  26. <a class="navbar-brand" href="#">联通用户管理系统</a>
  27. </div>
  28. <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
  29. <ul class="nav navbar-nav">
  30. <li><a href="/depart/list">部门管理</a></li>
  31. <li><a href="#">部门管理</a></li>
  32. </ul>
  33. <ul class="nav navbar-nav navbar-right">
  34. <li><a href="#">登录</a></li>
  35. <li class="dropdown">
  36. <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">大炮<span class="caret"></span></a>
  37. <ul class="dropdown-menu">
  38. <li><a href="#">个人资料</a></li>
  39. <li><a href="#">我的信息</a></li>
  40. <li role="separator" class="divider"></li>
  41. <li><a href="#">注销Separated link</a></li>
  42. </ul>
  43. </li>
  44. </ul>
  45. </div>
  46. </div>
  47. </nav>
  48. {#内容部分#}
  49. <div>
  50. <div class="container">
  51. {#按钮#}
  52. <div style="margin-bottom: 10px">
  53. <a class="btn btn-success " href="#">
  54. <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
  55. 新建部门
  56. </a>
  57. </div>
  58. <div class="panel panel-default">
  59. <!-- Default panel contents -->
  60. <div class="panel-heading">
  61. <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>
  62. 部门列表
  63. </div>
  64. <!-- Table -->
  65. <table class="table table-bordered" >
  66. <thead>
  67. <tr>
  68. <th>ID</th>
  69. <th>名称</th>
  70. <th>操作</th>
  71. </tr>
  72. </thead>
  73. <tbody>
  74. <tr>
  75. <th>1</th>
  76. <td>销售部</td>
  77. <td>
  78. <a class="btn btn-primary btn-xs">编辑</a>
  79. <a class="btn btn-danger btn-xs">删除</a>
  80. </td>
  81. </tr>
  82. </tbody>
  83. </table>
  84. </div>
  85. </div>
  86. </div>
  87. <script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
  88. <script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.min.js' %}"></script>
  89. </body>
  90. </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:

  1. {% load static %}
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}">
  8. <style>
  9. .navbar{
  10. {#去掉圆角样式#}
  11. border-radius: 0;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. {#导航部分#}
  17. <nav class="navbar navbar-default">
  18. {# container-fluid:导航平铺 container:让导航居中 #}
  19. <div class="container">
  20. <div class="navbar-header">
  21. <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
  22. <span class="sr-only">Toggle navigation</span>
  23. <span class="icon-bar"></span>
  24. <span class="icon-bar"></span>
  25. <span class="icon-bar"></span>
  26. </button>
  27. <a class="navbar-brand" href="#">联通用户管理系统</a>
  28. </div>
  29. <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
  30. <ul class="nav navbar-nav">
  31. <li><a href="/depart/list">部门管理</a></li>
  32. <li><a href="#">部门管理</a></li>
  33. </ul>
  34. <ul class="nav navbar-nav navbar-right">
  35. <li><a href="#">登录</a></li>
  36. <li class="dropdown">
  37. <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">大炮<span class="caret"></span></a>
  38. <ul class="dropdown-menu">
  39. <li><a href="#">个人资料</a></li>
  40. <li><a href="#">我的信息</a></li>
  41. <li role="separator" class="divider"></li>
  42. <li><a href="#">注销Separated link</a></li>
  43. </ul>
  44. </li>
  45. </ul>
  46. </div>
  47. </div>
  48. </nav>
  49. <div>
  50. <div class="container">
  51. <div class="panel panel-default">
  52. <div class="panel-heading">
  53. <h3 class="panel-title">新建部门</h3>
  54. </div>
  55. <div class="panel-body">
  56. <form >
  57. <div class="form-group">
  58. <label>标题</label>
  59. <input type="text" class="form-control" placeholder="标题" name="title">
  60. </div>
  61. <button type="submit" class="btn btn-primary" >提交</button>
  62. </form>
  63. </div>
  64. </div>
  65. </div>
  66. </div>
  67. <script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
  68. <script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.min.js' %}"></script>
  69. </body>
  70. </html>

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

部门-添加(动态)

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

views.py:

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

部门-删除

部门-编辑

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

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

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

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

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

模板的继承

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

 模板:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <link rel="stylesheet" href="">
  7. {% block css %}{% endblock %}
  8. </head>
  9. <body>
  10. <h1>标题</h1>
  11. <div>
  12. {% block content %}{% endblock %}
  13. </div>
  14. <h1>底部</h1>
  15. <script></script>
  16. {% block js %}{% endblock %}
  17. </body>
  18. </html>

继承模板:

  1. {#继承模板#}
  2. {% extends 'layout.html' %}
  3. {#如果每个页面既有共有的样式也有独有的样式,可以继承共有的,单独写独有的#}
  4. {% block css %}
  5. <link rel="stylesheet" href="">
  6. <style>
  7. </style>
  8. {% endblock %}
  9. {% block content %}
  10. <h1>首页</h1>
  11. {% endblock %}
  12. {% block js %}
  13. <script>
  14. </script>
  15. {% 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:

  1. {% extends 'layout.html' %}
  2. {% block content %}
  3. <div class="container">
  4. <div class="panel panel-default" >
  5. <div class="panel-heading">
  6. <h3 class="panel-title">新建用户</h3>
  7. </div>
  8. <div class="panel-body">
  9. <form method="POST">
  10. {% csrf_token %}
  11. <div class="form-group">
  12. <label>姓名</label>
  13. <input type="text" class="form-control" placeholder="姓名" name="user">
  14. </div>
  15. <div class="form-group">
  16. <label>密码</label>
  17. <input type="text" class="form-control" placeholder="密码" name="pwd">
  18. </div>
  19. <div class="form-group">
  20. <label>年龄</label>
  21. <input type="text" class="form-control" placeholder="年龄" name="age">
  22. </div>
  23. <div class="form-group">
  24. <label>余额</label>
  25. <input type="text" class="form-control" placeholder="余额" name="ac">
  26. </div>
  27. <div class="form-group">
  28. <label>入职时间</label>
  29. <input type="text" class="form-control" placeholder="入职时间" name="ctime">
  30. </div>
  31. <div class="form-group">
  32. <label>性别</label>
  33. <select class="form-control" name="gd">
  34. {# <option value="2"></option> 写死#}
  35. {% for item in gender_choices %}
  36. <option value="{{ item.0 }}">{{ item.1 }}</option>
  37. {% endfor %}
  38. </select>
  39. </div>
  40. <div class="form-group">
  41. <label>部门</label>
  42. <select class="form-control" name="dp">
  43. {% for item in depart_list %}
  44. <option value="{{ item.id }}">{{ item.title }}</option>
  45. {% endfor %}
  46. </select>
  47. </div>
  48. <button type="submit" class="btn btn-primary" >提交</button>
  49. </form>
  50. </div>
  51. </div>
  52. </div>
  53. {% endblock %}

Form和ModelForm

原始方法:

views.py

  1. def user_add(request):
  2. """ 添加用户(原始方式)"""
  3. if request.method == "GET":
  4. context = {
  5. 'gender_choices': models.UserInfo.gender_choices,
  6. 'depart_list': models.Department.objects.all()
  7. }
  8. return render(request, "user_add.html", context)
  9. # 如果是POST请求,获取用户提交的数据
  10. user = request.POST.get('user')
  11. pwd = request.POST.get('pwd')
  12. age = request.POST.get('age')
  13. account = request.POST.get('ac')
  14. ctime = request.POST.get('ctime')
  15. gender = request.POST.get('gd')
  16. depart_id = request.POST.get('dp')
  17. # 添加到数据库
  18. models.UserInfo.objects.create(name=user, password=pwd,
  19. age=age, account=account, create_time=ctime,
  20. gender=gender, depart_id=depart_id)
  21. # 返回到用户列表页面
  22. return redirect("/user/list/")

user_add.html:

  1. {% extends 'layout.html' %}
  2. {% block content %}
  3. <div class="container">
  4. <div class="panel panel-default" >
  5. <div class="panel-heading">
  6. <h3 class="panel-title">新建用户</h3>
  7. </div>
  8. <div class="panel-body">
  9. <form method="POST">
  10. {% csrf_token %}
  11. <div class="form-group">
  12. <label>姓名</label>
  13. <input type="text" class="form-control" placeholder="姓名" name="user">
  14. </div>
  15. <div class="form-group">
  16. <label>密码</label>
  17. <input type="text" class="form-control" placeholder="密码" name="pwd">
  18. </div>
  19. <div class="form-group">
  20. <label>年龄</label>
  21. <input type="text" class="form-control" placeholder="年龄" name="age">
  22. </div>
  23. <div class="form-group">
  24. <label>余额</label>
  25. <input type="text" class="form-control" placeholder="余额" name="ac">
  26. </div>
  27. <div class="form-group">
  28. <label>入职时间</label>
  29. <input type="text" class="form-control" placeholder="入职时间" name="ctime">
  30. </div>
  31. <div class="form-group">
  32. <label>性别</label>
  33. <select class="form-control" name="gd">
  34. {# <option value="2"></option> 写死#}
  35. {% for item in gender_choices %}
  36. <option value="{{ item.0 }}">{{ item.1 }}</option>
  37. {% endfor %}
  38. </select>
  39. </div>
  40. <div class="form-group">
  41. <label>部门</label>
  42. <select class="form-control" name="dp">
  43. {% for item in depart_list %}
  44. <option value="{{ item.id }}">{{ item.title }}</option>
  45. {% endfor %}
  46. </select>
  47. </div>
  48. <button type="submit" class="btn btn-primary" >提交</button>
  49. </form>
  50. </div>
  51. </div>
  52. </div>
  53. {% endblock %}

Form

views.py

  1. # myForm类继承django的Form
  2. class MyForm(Form):
  3. # widget=forms.Input是插件,可以直接在前端页面生成一个输入框
  4. user = forms.CharField(widget=forms.Input)
  5. pwd = form.CharFiled(widget=forms.Input)
  6. email = form.CharFiled(widget=forms.Input)
  7. account = form.CharFiled(widget=forms.Input)
  8. create_time = form.CharFiled(widget=forms.Input)
  9. depart = form.CharFiled(widget=forms.Input)
  10. gender = form.CharFiled(widget=forms.Input)
  11. def user_add(request):
  12. if request.method == "GET":
  13. # 实例化一个对象
  14. form = MyForm()
  15. return render(request, 'user_add.html',{"form":form})

user_add.html

  1. ```html
  2. <form method="post">
  3. {% for field in form%}
  4. {{ field }}
  5. {% endfor %}
  6. <!-- <input type="text" placeholder="姓名" name="user" /> -->
  7. </form>
  8. ```
  9. ```html
  10. <form method="post">
  11. <!-- 会自动生成html标签 <input type="text" class="form-control" placeholder="姓名" name="user"> -->
  12. {{ form.user }}
  13. {{ form.pwd }}
  14. {{ form.email }}
  15. <!-- <input type="text" placeholder="姓名" name="user" /> -->
  16. </form>
  17. ```

ModelForm

models.py

  1. class UserInfo(models.Model):
  2. """ 员工表 """
  3. name = models.CharField(verbose_name="姓名", max_length=16)
  4. password = models.CharField(verbose_name="密码", max_length=64)
  5. age = models.IntegerField(verbose_name="年龄")
  6. account = models.DecimalField(verbose_name="账户余额", max_digits=10, decimal_places=2, default=0)
  7. create_time = models.DateTimeField(verbose_name="入职时间")
  8. depart = models.ForeignKey(to="Department", to_field="id", on_delete=models.CASCADE)
  9. gender_choices = (
  10. (1, "男"),
  11. (2, "女"),
  12. )
  13. gender = models.SmallIntegerField(verbose_name="性别", choices=gender_choices)

views.py

  1. class MyForm(ModelForm):
  2. # xx = form.CharField*("...")
  3. class Meta:
  4. model = UserInfo
  5. fields = ["name","password","age","xx"]
  6. def user_add(request):
  7. if request.method == "GET":
  8. form = MyForm()
  9. return render(request, 'user_add.html',{"form":form})

user_add.html

  1. ```html
  2. <form method="post">
  3. {% for field in form%}
  4. {{ field }}
  5. {% endfor %}
  6. <!-- <input type="text" placeholder="姓名" name="user" /> -->
  7. </form>
  8. ```
  9. ```html
  10. <form method="post">
  11. {{ form.user }}
  12. {{ form.pwd }}
  13. {{ form.email }}
  14. <!-- <input type="text" placeholder="姓名" name="user" /> -->
  15. </form>
  16. ```

用户-添加(ModelForm)

user_model_form_add.html:

  1. {% extends 'layout.html' %}
  2. {% block content %}
  3. <div class="container">
  4. <div class="panel panel-default" >
  5. <div class="panel-heading">
  6. <h3 class="panel-title">新建用户</h3>
  7. </div>
  8. <div class="panel-body">
  9. <form method="POST">
  10. {% csrf_token %}
  11. {% for field in form %}
  12. <div class="form-group">
  13. <label>{{ field.label }}</label>
  14. {{ field }}
  15. </div>
  16. {% endfor %}
  17. <button type="submit" class="btn btn-primary" >提交</button>
  18. </form>
  19. </div>
  20. </div>
  21. </div>
  22. {% endblock %}

用户-添加和错误提示

编辑用户:

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

 删除用户

整体代码: 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/865192
推荐阅读
相关标签
  

闽ICP备14008679号