Python项目:Django员工管理系统

一、项目创建
在这里插入图片描述

二、修改配置文件
1、settings.py里面,删除'DIRS': [os.path.join(BASE_DIR, 'templates')]里面的内容并删除templates文件夹
在这里插入图片描述

三、 创建APP01
在控制台创建应用
在这里插入图片描述
之后在sattings.py里面注册app01
在这里插入图片描述

四、设计表结构

models.py

from django.db import models


# Create your models here.

# 部门管理
class Department(models.Model):
    """部门表"""
    # 没有写id,因为django自动创建id,并且是主键、自增的。这里我们自己写一个
    # id = models.BigAutoField(verbose_name='ID', primary_key=True)
    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,小数位是2, 默认值是0
    account = models.DecimalField(verbose_name="账户余额", max_digits=10, decimal_places=2, default=0)

    create_time = models.DateTimeField(verbose_name="入职时间")

    # 1. 关联Department
    #       -to, 与哪张表关联
    #       -to_field  与表中哪一列关联
    # 2. 在实际生成的时候会自动变成depart_id
    # 3. 如果Department中没有相关id,我们就删除这个部门的员工信息
    # depart = models.ForeignKey(to="Department", to_field="id", on_delete=models.CASCADE)
    # 3.1 如果不想把员工删除,可以将部门id置空
    depart = models.ForeignKey(to="Department", to_field="id", null=True, blank=True, on_delete=models.SET_NULL)


    # 约束
    sex_choice = {
        (1, "男"),
        (1, "女")
    }
    sex = models.SmallIntegerField(verbose_name="性别", choices=sex_choice)

五、在MySQL里面生成表

  • 工具连接MySQL生成数据库
create database em_django DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

在这里插入图片描述

  • 修改配置文件,连接MySQL
    settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'em_django',  # 数据库名字
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': '127.0.0.1',  # 那台机器安装了MySQL
        'PORT': 3306,
    }
}
  • 通过django命令生成数据库表
  python manage.py makemigrations
  python manage.py migrate

在这里插入图片描述
这里可能遇到报错:

django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table ((1064, “You have an error in your SQL syntax; check
the manual that corresponds to your MySQL server version for the right syntax to use near ‘(6) NOT NULL)’ at line 1”))

这是因为django和mysql版本不兼容导致的,我们不需要降低版本,在setting里面添加

from django.db.backends.mysql.base import DatabaseWrapper
DatabaseWrapper.data_types['DateTimeField'] = 'datetime'

在MySQL里查看
在这里插入图片描述

五、静态文件的管理
将static扔进app01里面,并且记得配置

static结构:
在这里插入图片描述
static文件配置:settings.py
在这里插入图片描述

七、部门的管理

我们先用最原始的方式编写,之后会使用django里面的form和modelform组件

7.1 部门列表
添加url
在这里插入图片描述

添加视图:
在这里插入图片描述

{% 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-dist/css/bootstrap.css' %}>

</head>
<body>
<nav class="navbar navbar-default">
    <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="/user/list/">用户管理</a></li>
                <li><a href="#">Link</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="#">注销</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 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-dist/js/bootstrap.js' %}"></script>

</body>
</html>

在这里插入图片描述

我们在数据库里添加两条数据:
insert into app01_department(title) values("IT部"),("销售部");

insert into app01_patient(title) values(“IT部”),(“销售部”);
我们希望可以在刚才的depart/list页面可以动态显示

views.py

from django.shortcuts import render
from app01 import models
# Create your views here.
def depart_list(request):
    """部门列表"""
    # 去数据库里面获取所有部门列表
    # queryset:[对象,对象……]
    queryset = models.Department.objects.all()
    return render(request,'depart_list.html', {'queryset': queryset})

depart_list.html,改写

 {% for obj in queryset %}
                    <tr>
                        <th>{{ obj.id }}</th>
                        <td>{{ obj.title }}</td>
                        <td>
                            <a class="btn btn-primary btn-xs">新建</a>
                            <a class="btn btn-danger btn-xs">删除</a>
                        </td>
                    </tr>
                {% endfor %}

成功显示:
在这里插入图片描述

添加页面
点击新建部门可以跳转
depart_list.html

  <a class="btn btn-success" href="/depart/add/" target="_blank">
                <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
                新建部门
            </a>

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-dist/css/bootstrap.css' %}>

</head>
<body>

<nav class="navbar navbar-default">
    <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="/user/list/">用户管理</a></li>
                <li><a href="#">Link</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="#">注销</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 method="post">
                    {% csrf_token %} <!--使用post方法必须要写这个,不然报错403-->
                    <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-dist/js/bootstrap.js' %}"></script>

</body>
</html>

views.py

from django.shortcuts import render, redirect
from app01 import models
def depart_add(request):
    """添加部门"""
    if request.method == "GET":
        return render(request, 'depart_add.html')
    # 获取用户POST传过来的数据(暂时不考虑为空的情况)
    title = request.POST.get("title")
    # 保存到数据库
    models.Department.objects.create(title=title)
    # 重定向回到部门列表
    return redirect("/depart/list/")

在这里插入图片描述
在这里插入图片描述

删除
views.py

def depart_delete(request):
    """删除部门"""
    # 获取ID
    # http://127.0.0.1:8000/depart/delete/?nid=1
    nid = request.GET.get('nid')
    # 删除
    models.Department.objects.filter(id=nid).delete()

    # 重定向回到部门列表
    return redirect("/depart/list/")

depart_list.html

 {% for obj in queryset %}
                    <tr>
                        <th>{{ obj.id }}</th>
                        <td>{{ obj.title }}</td>
                        <td>
                            <a class="btn btn-primary btn-xs">编辑</a>
                            <a class="btn btn-danger btn-xs" href="/depart/delete/?nid={{ obj.id }}">删除</a>
                        </td>
                    </tr>
                {% endfor %}

编辑

urls.py

    # http://127.0.0.1:8000/depart/2/edit/
    path('depart/<int:nid>/edit/', views.depart_edit),

views.py

def depart_edit(request, nid):
    """编辑部门"""
    if request.method =="GET":
        # 根据nid,获取他的数据
        row_object = models.Department.objects.filter(id=nid).first()

        return render(request, "depart_edit.html", {"row_object": row_object})

    # 获取用户提交的标题并修改
    title = request.POST.get("title")
    models.Department.objects.filter(id=nid).update(title=title)

    # 重定向回到部门列表
    return redirect("/depart/list/")

depart_edit.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-dist/css/bootstrap.css' %}>

</head>
<body>

<nav class="navbar navbar-default">
    <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="/user/list/">用户管理</a></li>
                <li><a href="#">Link</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="#">注销</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 method="post">
                    {% csrf_token %} <!--使用post方法必须要写这个,不然报错403-->
                    <div class="form-group">
                        <label>标题</label>
                        <input type="text" class="form-control" placeholder="标题" name="title" value="{{ row_object.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-dist/js/bootstrap.js' %}"></script>

</body>
</html>

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

模板的继承

  • 部门列表
  • 添加部门
  • 编辑部门

我们可以看到前面写的代码有大量重复的,这样代码复用就很低。Django提供了模板功能

定义模板layout.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-dist/css/bootstrap.css' %}>

</head>
<body>
<nav class="navbar navbar-default">
    <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="/user/list/">用户管理</a></li>
                <li><a href="#">Link</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="#">注销</a></li>
                    </ul>
                </li>
            </ul>
        </div>
    </div>
</nav>


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


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

</body>
</html>

其他的html也可改写
list:


{% extends 'layout.html' %}

{% block content %}
    <div class="container">
        <div style="margin-bottom: 10px">
                <!--跳转并打开新页面-->
            <a class="btn btn-success" href="/depart/add/" target="_blank">
                <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 class="table table-bordered">
                <thead>
                <tr>
                    <th>ID</th>
                    <th>部门名称</th>
                    <th>操作</th>
                </tr>
                </thead>
                <tbody>
                {% for obj in queryset %}
                    <tr>
                        <th>{{ 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/delete/?nid={{ obj.id }}">删除</a>
                        </td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
    </div>
{% endblock %}

add:


{% 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 %} <!--使用post方法必须要写这个,不然报错403-->
                    <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>

{% endblock %}

八、 用户列表:

添加数据:

insert into app01_userinfo(name,password,age,account,create_time,sex,depart_id) values("李四","666",23,100.68,"2020-01-11",2,1);

insert into app01_userinfo(name,password,age,account,create_time,sex,depart_id) values("王五","123",23,100.68,"2011-11-11",1,3);

insert into app01_userinfo(name,password,age,account,create_time,sex,depart_id) values("赵六","999",33,9900.68,"2022-05-11",1,1);

在这里插入图片描述
views.py

# 用户管理
def user_list(request):
    """用户管理"""

    # 获取所有的用户信息 [obj, obj ……]
    queryset = models.UserInfo.objects.all()
    """
    # 使用python的语法来获取
    for obj in queryset:

        print(obj.id, obj.name, obj.account, obj.create_time.strftime("%Y-%m-%d"))
        # get_字段名_display()
        print(obj.get_sex_display())
        obj.depart_id  # 获取数据库中存储的那个字段值
        obj.depart.title     # 根据id自动去关联表中id那一行的depart对象"""

    return render(request, 'user_list.html', {'queryset':queryset})

user_list.html

{% extends 'layout.html' %}

{% block content %}

    <div class="container">
        <div style="margin-bottom: 10px">
            <!--跳转并打开新页面-->
            <a class="btn btn-success" href="#" target="_blank">
                <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 class="table table-bordered">
                <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>{{ 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_sex_display }}</td>
                    <td>{{ obj.depart.title }}</td>

                    <td>
                        <a class="btn btn-primary btn-xs" href="#">编辑</a>
                        <a class="btn btn-danger btn-xs" href="#">删除</a>
                    </td>
                </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
    </div>

{% endblock %}

在这里插入图片描述
用户添加(原始方式)

  • 原始方式理思路:不会采用(本质)【麻烦】

    - 用户提交数据没有校验。
    - 错误,页面上应该有错误提示。
    - 页面上,没一个字段都需要我们重新写一遍。 
    - 关联的数据,手动去获取并展示循环展示在页面。 
    
  • Django组件

    • Form组件(小简便)
    • ModelForm组件(最简便)

用户添加(modelform)

urls.py

    # 用户管理
    path('user/list/', views.user_list),
    path('user/add/', views.user_add),
    path('user/model/form/add/', views.user_model_form_add),

views.py

#  ModelForm  示例
from django import forms


class UserModelForm(forms.ModelForm):

    # 限制姓名的长度,至少为3位
    name = forms.CharField(min_length=3,label='用户名')


    class Meta:
        model = models.UserInfo
        fields = ["name", "password", "age", "account", "create_time", "sex", "depart"]
        # widgets = {
        #     "name": forms.TextInput(attrs={"class": "from-control"})
        # }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # 循环找到所有插件,添加了class: "from-control"
        for name, field in self.fields.items():
            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)
        """

       # class Meta: model = models.UserInfo,因此保存至UserInfo中
       form.save()
       return render('/user/list/')
    # 校验失败,在页面上显示错误信息
    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">
                <h3 class="panel-title">新建用户</h3>
            </div>
            <div class="panel-body">
                <form method="post" novalidate>  <!--novalidate 关掉浏览器校验,便于显示自定义校验 -->
                    {% csrf_token %} <!--使用post方法必须要写这个,不然报错403-->
                    {% for field in form %}
                    <div class="form-group">
                        <label>{{ field.label }}</label>
                        {{ field }}
                        <span style="color: red">{{ field.errors.0 }}</span>
                       <!-- <input type="text" class="form-control" placeholder="姓名">-->
                    </div>
                    {% endfor %}
               <button type="submit" class="btn btn-primary">保 存</button>
                </form>
            </div>
        </div>
    </div>

{% endblock %}

显示汉字:
settings.py
在这里插入图片描述

七、

8.4 编辑用户

  • 点击编辑,跳转到编辑页面(将编辑行的ID携带过去)。

  • 编辑页面(默认数据,根据ID获取并设置到页面中)

  • 提交:

    • 错误提示
    • 数据校验
    • 在数据库更新

urls.py
path('user/<int:nid>/edit/', views.user_edit),

views.py


def user_edit(request, nid):
    """编辑用户"""
    row_object = models.UserInfo.objects.filter(id=nid).first()
    if request.method == "GET":
        # 根据id去数据库获取要编辑的那一行数据

        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.instance.字段名 = 值
        form.save()
        return render('/user/list')
    return render(request, 'user_edit.html', {'form': form})

user_edit.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" novalidate>  <!--novalidate 关掉浏览器校验,便于显示自定义校验 -->
                    {% csrf_token %} <!--使用post方法必须要写这个,不然报错403-->

                    {% for field in form %}
                        <div class="form-group">
                            <label>{{ field.label }}</label>
                            {{ field }}
                            <span style="color: red">{{ field.errors.0 }}</span>
                            <!-- <input type="text" class="form-control" placeholder="姓名">-->
                        </div>
                    {% endfor %}

                    <button type="submit" class="btn btn-primary">保 存</button>
                </form>
            </div>
        </div>
    </div>

{% endblock %}

九、删除用户

views.py

def user_delete(request, nid):
    models.UserInfo.objects.filter(id=nid).delete()
    return render('/user/list/')

十、

9.1 表结构

根据表结构的需求,在models.py中创建类(由类生成数据库中的表)。

class PrettyNum(models.Model):
    """ 靓号表 """
    mobile = models.CharField(verbose_name="手机号", max_length=11)
    # 想要允许为空 null=True, blank=True
    price = models.IntegerField(verbose_name="价格", default=0)

    level_choices = (
        (1, "1级"),
        (2, "2级"),
        (3, "3级"),
        (4, "4级"),
    )
    level = models.SmallIntegerField(verbose_name="级别", choices=level_choices, default=1)

    status_choices = (
        (1, "已占用"),
        (2, "未使用")
    )
    status = models.SmallIntegerField(verbose_name="状态", choices=status_choices, default=2)

自己在数据模拟创建一些数据:

insert into app01_prettynum(mobile,price,level,status)values("111111111",19,1,1);
mysql> select * from app01_prettynum;
+----+-----------+-------+-------+--------+
| id | mobile    | price | level | status |
+----+-----------+-------+-------+--------+
|  1 | 111111111 |    19 |     1 |      1 |
|  2 | 111111111 |    19 |     1 |      1 |
|  3 | 111111111 |    19 |     1 |      1 |
|  4 | 111111111 |    19 |     1 |      1 |
+----+-----------+-------+-------+--------+
4 rows in set (0.01 sec)

9.2 靓号列表

  • URL

  • 函数

    • 获取所有的靓号

    • 结合html+render将靓号罗列出来

      id	号码	价格	级别(中文)	状态(中文)
      

views.py

def pretty_list(request):
    """靓号管理"""
    # select * from 表 order by level desc;对级别倒序
    queryset = models.PrettyNum.objects.order_by("-level")

    return render(request,'pretty_list.html', {'queryset': queryset})

{% extends 'layout.html' %}

{% block content %}

     <div class="container">
        <div style="margin-bottom: 10px">
            <!--跳转并打开新页面-->
            <a class="btn btn-success" href="/user/add/" target="_blank">
                <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 class="table table-bordered">
                <thead>
                <tr>
                    <th>ID</th>
                    <th>号码</th>
                    <th>价格</th>
                    <th>级别</th>
                    <th>状态</th>
                    <th>操作</th>


                </tr>
                </thead>
                <tbody>
                {% for obj in queryset %}
                    <tr>
                        <th>{{ obj.id }}</th>
                        <td>{{ obj.mobile }}</td>
                        <td>{{ obj.price }}</td>
                        <td>{{ obj.get_level_display }}</td>
                        <td>{{ obj.get_status_display }}</td>
                        <td>
                            <a class="btn btn-primary btn-xs" href="#">编辑</a>
                            <a class="btn btn-danger btn-xs" href="#">删除</a>
                        </td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
    </div>

{% endblock %}

9.3 新建靓号

  • 列表点击跳转:/pretty/add/

  • URL

  • ModelForm类

    from django import forms
    
    class PrettyModelForm(forms.ModelForm):
    	...
    
  • 函数

    • 实例化类的对象
    • 通过render将对象传入到HTML中。
    • 模板的循环展示所有的字段。
  • 点击提交

    • 数据校验
    • 保存到数据库
    • 跳转回靓号列表

9.4 编辑靓号

  • 列表页面:/pretty/数字/edit/
  • URL
  • 函数
    • 根据ID获取当前编辑的对象
    • ModelForm配合,默认显示数据。
    • 提交修改。

lue

管理员
models.py

class Admin(models.Model):
    """管理员"""
    username = models.CharField(verbose_name="用户名", max_length=32)
    password = models.CharField(verbose_name="密码", max_length=64)

创建数据库:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

管理员列表:

在这里插入图片描述

views.py


def admin_list(request):
    """管理员列表"""

    queryset = models.Admin.objects.all()

    context = {
        'queryset':queryset
    }
    return render(request, 'admin_list.html', {'context': context})

admin_list.html

{% extends 'layout.html' %}


{% block content %}

    <div class="container">
        <div style="margin-bottom: 10px" class="clearfix">
            <!--跳转并打开新页面-->
            <a class="btn btn-success" href="#" target="_blank">
                <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
                新建管理员
            </a>

            <div style="float: right ; width: 300px">

                <form method="get">
                    <div class="input-group">
                        <input type="text" name="q" class="form-control" placeholder="搜索" value="{{ search_data }}">
                        <span class="input-group-btn">
                    <button class="btn btn-default" type="submit">GO!</button>
                    </span>

                    </div>
                </form>
            </div>

        </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 class="table table-bordered">
                <thead>
                <tr>
                    <th>ID</th>
                    <th>用户名</th>
                    <th>密码</th>
                    <th>操作</th>


                </tr>
                </thead>
                <tbody>
                {% for obj in queryset %}
                    <tr>
                        <th>{{ obj.id }}</th>
                        <td>{{ obj.username }}</td>
                        <td>******</td>
                        <td>
                            <a class="btn btn-primary btn-xs" href="#">编辑</a>
                            <a class="btn btn-danger btn-xs" href="#">删除</a>
                        </td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>

    </div>

{% endblock %}

向数据库插入数据

 insert into app01_admin(username,password) values("LiHua","123");

views.py

# 导入分页
from app01.utils.pagination import Pagination

def admin_list(request):
    """管理员列表"""

    # 搜索功能
    data_dict = {}
    search_data = request.GET.get('q', "")
    if search_data:
        data_dict["username__contains"] = search_data
    # 根据搜索条件去数据库获取
    queryset = models.Admin.objects.filter(**data_dict)


    # 分页功能
    page_object = Pagination(request, queryset)
    context = {
        'queryset': page_object.page_queryset,
        'page_string': page_object.html(),
        'search_data': search_data
    }
    return render(request, 'admin_list.html', context)
``
![在这里插入图片描述](https://img-blog.csdnimg.cn/215585c566e74bc28c98d6c99c84bfe3.png#pic_center)

新建管理员
确认密码,加密。
代码


编辑管理员
带啊吗

重置密码

  • 14
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值