Django学习-武沛齐教程【day2】

员工管理系统

新建项目

django-admin startproject manage

django-admin startapp app01

运行项目:python manage.py runserver

注册app

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config', # 添加app01
]

设计表结构

from django.db import models


class Department(models.Model):
    # 部门表
    title = models.CharField(verbose_name="标题", max_length=32)


class UserInfo(models.Model):
    # 员工表
    name = models.CharField(verbose_name="姓名", max_length=16)
    pwd = 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.DateField(verbose_name="入职时间")
    # #部门被删除,员工置空
    # depart = models.ForeignKey(
    #     to="Department", to_field="id", null=True, blank=True, on_delete=models.SET_NULL)
    # 部门被删除,员工级联删除
    depart = models.ForeignKey(
        to="Department", to_field="id", on_delete=models.CASCADE)
    gender_choices=(
        (1,"男"),
        (2,"女")
    )
    # 只能选择1、2
    gender=models.SmallIntegerField(verbose_name="性别",choices=gender_choices)

MYsql生成表

创建数据库

create database manage default charset utf8 collate utf8_general_ci;

在mysite/settings.py中进行配置和修改

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test', #数据库的名字
        'HOST': '127.0.0.1', #数据库地址
        'PORT': '3306', #端口
        'USER': 'root', #用户名
        "PASSWORD": 'root123456', #密码
    }
}

命令行执行:

python manage.py makemigrations

python manage.py migrate

静态文件和模版文件管理

app01中添加static、templates目录

部门管理

手动插入数据

insert into app01_department(title) values("IT部"),("销售部");

部门列表

  • urls.py
urlpatterns = [
    path('depart/list/',views.depart_list),
]

  • views.py
from django.shortcuts import render
from app01 import models

def depart_list(request):
    # 部门列表
    queryset = models.Department.objects.all()
    return render(request, 'depart_list.html',{'queryset':queryset})

  • templates/depart_list.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
  <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1-dist/css/bootstrap.css' %}">
  <style>
    /* 去除导航条的圆角 */
    .navbar {
      border-radius: 0;
    }
  </style>
</head>

<body>
  <nav class="navbar navbar-default">
    <div class="container">
      <!-- Brand and toggle get grouped for better mobile display -->
      <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="#">部门管理</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="bs-example" data-example-id="table-within-panel">
        <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>
              {% 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 %}
            </tbody>
          </table>
        </div>
      </div>
    </div>
  </div>

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

</body>
</html>

新建部门

  • urls.py
urlpatterns = [
    path('depart/list/',views.depart_list),
    path('depart/add/',views.depart_add),
]

  • views.py
def depart_add(request):
    # 添加页面
    if request.method == "GET":
        return render(request, 'depart_add.html')
    title = request.POST.get("title")
    models.Department.objects.create(title=title)
    return redirect('/depart/list/')
  • templates/depart_add.html
{% load static %}
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1-dist/css/bootstrap.css' %}">
    <style>
        /* 去除导航条的圆角 */
        .navbar {
            border-radius: 0;
        }
    </style>
</head>

<body>
    <nav class="navbar navbar-default">
        <div class="container">
            <!-- Brand and toggle get grouped for better mobile display -->
            <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="#">部门管理</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 %}
                        <div class="form-group">
                            <label>标题</label>
                            <input type="text" class="form-control" name="title" placeholder="标题">
                        </div>
                        <button type="submit" class="btn btn-primary">提交</button>
                    </form>
                </div>
            </div>
        </div>
    </div>

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

</body>

</html>

删除部门

  • urls.py
urlpatterns = [
    path('depart/list/',views.depart_list),
    path('depart/add/',views.depart_add),
    path('depart/delete/',views.depart_delete),
]

  • views.py
def depart_delete(request):
    # 删除部门
    nid = request.GET.get("nid")
    models.Department.objects.filter(id=nid).delete()
    return redirect('/depart/list/')

  • templates/depart_list.html
<tbody>
  {% 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 %}
</tbody>

编辑部门

  • urls.py
urlpatterns = [
    path('depart/list/',views.depart_list),
    path('depart/add/',views.depart_add),
    path('depart/delete/',views.depart_delete),
    # <int:nid>正则表达式
    path('depart/<int:nid>/edit/',views.depart_edit),
]
  • views.py
def depart_edit(request,nid):
    # 修改部门
    if request.method == "GET":
        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/')


  • templates/depart_list.html
<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>
  • templates/depart_edit.html
{% load static %}
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1-dist/css/bootstrap.css' %}">
    <style>
        /* 去除导航条的圆角 */
        .navbar {
            border-radius: 0;
        }
    </style>
</head>

<body>
    <nav class="navbar navbar-default">
        <div class="container">
            <!-- Brand and toggle get grouped for better mobile display -->
            <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="#">部门管理</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 %}
                        <div class="form-group">
                            <label>标题</label>
                            <input type="text" class="form-control" name="title" placeholder="标题" value="{
   
   {row_object.title}}">
                        </div>
                        <button type="submit" class="btn btn-primary">提交</button>
                    </form>
                </div>
            </div>
        </div>
    </div>

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

</body>

</html>

模版的继承

  • 在模版页layout.html中添加{% block 模块名 %}{% endblock %}
  • 其他页面可以使用{% extends 'layout.html' %}继承layout.html
  • 并在{% block 模块名 %}{% endblock %}内部编写独有内容
  • 模板页面:base.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>
  • 继承模板:extend.html
{% extends 'base.html' %}
{% block content %}
    <h1>hello world</h1>
{% endblock %}

使用模板更新部门管理页面

  • templates/layout.html
{% load static %}
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1-dist/css/bootstrap.css' %}">
    <style>
        /* 去除导航条的圆角 */
        .navbar {
            border-radius: 0;
        }
    </style>
</head>

<body>
    <nav class="navbar navbar-default">
        <div class="container">
            <!-- Brand and toggle get grouped for better mobile display -->
            <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="#">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.slim.min.js' %}"></script>
    <script src="{% static 'plugins/bootstrap-3.4.1-dist/js/bootstrap.js' %}"></script>

</body>

</html>
  • templates/depart_list.html
{% extends 'layout.html' %}
{% block content %}

<div class="container">
  <div style="margin-bottom: 10px;">
    <a class="btn btn-success" href="/depart/add/">
      <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
      新建部门
    </a>
  </div>

  <div class="bs-example" data-example-id="table-within-panel">
    <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>
          {% 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>
</div>

{% endblock %}
  • templates/depart_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" name="title" placeholder="标题">
                </div>
                <button type="submit" class="btn btn-primary">提交</button>
            </form>
        </div>
    </div>
</div>

{% endblock %}
  • templates/depart_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">
                {% csrf_token %}
                <div class="form-group">
                    <label>标题</label>
                    <input type="text" class="form-control" name="title" placeholder="标题" value="{
   
   {row_object.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,gender,depart_id) values("张三","123",23,100.66,"2010-11-11",1,2),("李四","1234",23,1333.66,"2012-11-11",2,7);

用户列表

  • urls.py
urlpatterns = [
    # 部门管理
    # ...
    # 用户管理
    path('depart/list/', views.depart_list),

]

  • views.py
def user_list(request):
    queryset = models.UserInfo.objects.all()
    return render(request, 'user_list.html', {'queryset': queryset})
  • templates/layout.html
<ul class="nav navbar-nav">
    <li><a href="/depart/list/">部门管理</a></li>
    <li><a href="/user/list/">用户管理</a></li>
</ul>
  • templates/user_list.html
{% extends 'layout.html' %}
{% block content %}

<div class="container">
  <div style="margin-bottom: 10px;">
    <a class="btn btn-success" href="/user/add/">
      <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
      新建用户
    </a>
  </div>

  <div class="bs-example" data-example-id="table-within-panel">
    <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>
            <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_gender_display}}</td>
            <td>{
   
   {obj.depart.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>
</div>

{% endblock %}

新建用户

原始方法思路

  • urls.py
urlpatterns = [
    # 用户管理
    path('user/list/', views.user_list),
    path('user/add/', views.user_add),
]

  • 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)
    name = request.POST.get("name")
    pwd = request.POST.get("pwd")
    age = request.POST.get("age")
    account = request.POST.get("ac")
    ctime = request.POST.get("ctime")
    gender_id = request.POST.get("gd")
    depart_id = request.POST.get("dp")
    models.UserInfo.objects.create(name=name, password=pwd, age=age,
                                     account=account, create_time=ctime, gender=gender_id, depart_id=depart_id)
    return redirect('/user/list/')
  • templates/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" name="name" placeholder="姓名">
                </div>
                <div class="form-group">
                    <label>密码</label>
                    <input type="text" class="form-control" name="pwd" placeholder="密码">
                </div>
                <div class="form-group">
                    <label>年龄</label>
                    <input type="text" class="form-control" name="age" placeholder="年龄">
                </div>
                <div class="form-group">
                    <label>余额</label>
                    <input type="text" class="form-control" name="ac" placeholder="余额">
                </div>
                <div class="form-group">
                    <label>入职时间</label>
                    <input type="text" class="form-control" name="ctime" placeholder="入职时间">
                </div>
                <div class="form-group">
                    <label>性别</label>
                    <select class="form-control" name="gd">
                        {% 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 %}

原始方法问题:

  • 用户提交数据没有校验
  • 页面上应该有错误提示
  • 页面上每个字段都要重新写一遍
  • 关联的数据,手动获取并展示,费劲

使用Django组件

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

初识Form

  • 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):
    form=MyForm()
    return render(request, 'user_add.html', {"form":form})

  • templates/user_add.html
<form method="post">
    {% csrf_token %}
    {% for field in form %}
        {
   
   {field}}
    {% endfor %}

    <button type="submit" class="btn btn-primary">提交</button>
</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.DateField(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):
    form=MyForm()
    return render(request, 'user_add.html', {"form":form})

  • templates/user_add.html
<form method="post">
    {% csrf_token %}
    {% for field in form %}
        {
   
   {field}}
    {% endfor %}

    <button type="submit" class="btn btn-primary">提交</button>
</form>

新建用户【ModelForm】

  • models.py
from django.db import models


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.DateField(verbose_name="入职时间")
    # #部门被删除,员工置空
    # depart = models.ForeignKey(
    #     to="Department", to_field="id", null=True, blank=True, on_delete=models.SET_NULL)
    # 部门被删除,员工级联删除
    depart = models.ForeignKey(verbose_name="部门",
        to="Department", to_field="id", on_delete=models.CASCADE)
    gender_choices=(
        (1,"男"),
        (2,"女")
    )
    # 只能选择1、2
    gender=models.SmallIntegerField(verbose_name="性别",choices=gender_choices)


  • views.py
class UserModelForm(forms.ModelForm):
    #验证规则
    name = forms.CharField(min_length=3, label="用户名")
    
    class Meta:
        model=models.UserInfo
        fields=["name","password","age","create_time","gender","depart"]
        widgets={
            "password":forms.PasswordInput(attrs={"class":"form-control"})
        }

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        # 给所有字段的input框加上class:"form-control"
        for name,field in self.fields.items():
            if name=="password":
                continue
            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():
        #如果数据合法,保存到数据库
        form.save() # 自动存储到数据库中
        return redirect("/user/list")
    else:
        #校验失败,form中包含错误信息和用户之前提交的数据
        return render(request,'user_model_form_add.html',{"form":form})

  • templates/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" 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-primary">提交</button>
            </form>
        </div>
    </div>
</div>

{% endblock %}
  • settings.py
LANGUAGE_CODE = 'zh-hans'

猜你喜欢

转载自blog.csdn.net/weixin_65656674/article/details/126592950
今日推荐