django项目实战(orm实现增删改查包括,user表使用ModelForm


在这里插入图片描述
成品展示,实现了新建编辑和删除功能,也就是增删改查

1.新建项目

1.1settings文件中的DIRS设为空列表

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": []

顺便把根目录中的templates删除

1.2创建app

python manage.py startapp app01

在这里插入图片描述
上图中的工具可以自动提供前面的python manage.py,这样只需要输入startapp app01就够了

1.3紧接着在settings中注册app


INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "app01.apps.App01Config"#这里注册了新建的app
]

编写表结构

from django.db import models

# Create your models here.
class Department(models.Model):
    """部门表"""
    # id=models.BigAutoField(verbose_name="ID",primary_key=True)
    # id=models.BigAutoField(verbose_name="ID",primary_key=True)可以自己写id,上面是bigint,下面是int,verbosename是表字段的注释
    title=models.CharField(verbose_name="标题",max_length=32)
class UserInfo(models.Model):
    """员工表"""
    name=models.CharField(verbose_name="姓名",max_length=16)
    password=models.CharField(max_length=64)
    age=models.IntegerField()
    account=models.DecimalField(verbose_name="账户余额",max_digits=10,decimal_places=2,default=0)
    create_time=models.DateTimeField(verbose_name="入职时间")
    #如果有外键
    #无约束
    # depart = models.BigIntegerField()
    
    # 1有约束约束
    #to与什么表关联
    #to_field与表中那一列关联
    #2 django自动
    #写的是depart,实际上生成的是depart_id
    #3部门表被删除
    #3.1如果级联删除
    depart = models.ForeignKey(to="Department", to_field="id",on_delete=models.CASCADE)
    #3.2置空
    #如果想要置空,首先需要允许为空
    # depart = models.ForeignKey(to="Department", to_field="id",blank=True,null=True,on_delete=models.SET_NULL)
    gender_choices=(
        (1,"男")
        (2,"女")
    )
    gender=models.SmallIntegerField(choices=gender_choices,verbose_name="性别")

请添加图片描述

1.4在mysql中生成表

创建表

CREATE DATABASE gx_day16 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

修改配置文件,连接mysql

DATABASES = {
    'default': {
    # 说明你要连的库为mysql
    'ENGINE': 'django.db.backends.mysql',
    # 数据库名称
    'NAME': 'gx_day16',
    # IP 本地为127.0.0.1
    'HOST':'127.0.0.1',
    # 端口默认是3306 oracel默认端口1521
    'PORT':'3306',
    # 数据库用户
    'USER':'root',
    # 数据库密码
    'PASSWORD':'123456'
    }
}

迁移
找到pycharm中工具中的运行manage.py选项
直接makemigrations和migrate
在这之前记得注册app

1.5静态文件管理

1.6部门管理

体验最原始的方式
django中提供更方便的Form和ModelForm组件

  • urls.py
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
    path('depart/list/',views.depart_list),
    path('depart/add/',views.depart_add),
    path('depart/delete/',views.depart_delete),##删除不能写成depart/delete,delete不是url的结束,不加会报错
    #/depart/10/edit/
    #/depart/5/edit/
    #/depart/3/edit/这样不用写问号了
    path('depart/<int:eid>/edit/',#views.depart_edit),正则表达式,通过点击编辑跳转到对应id的edit界面
    
]

views.py

from django.shortcuts import render,redirect
from app01 import models
# Create your views here.
def depart_list(request):
    queryset=models.Department.objects.all()

    return render(request,"depart_list.html",{"queryset":queryset})
def depart_add(request):
    if request.method=='GET':
        return render(request,"depart_add.html")
    else:
        title=request.POST.get("title")
        models.Department.objects.create(title=title)
        return redirect("/depart/list")
def depart_delete(request):#用get这种最普通的方法获取id
    nid=request.GET.get("nid")
    models.Department.objects.filter(id=nid).delete()
    return redirect("/depart/list")
def depart_edit(request,eid):
    if request.method=='GET':
        data_list=models.Department.objects.filter(id=eid)
        return render(request,"depart_edit.html",{"name":data_list.first().title})#编辑时,获取编辑前的值
    else:
        #接受用户更新的title
        title=request.POST.get("title")
        models.Department.objects.filter(id=eid).update(title=title)
        return redirect("/depart/list")

depart_list.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .navbar {
            border-radius: 0;
        }
    </style>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
</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>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav">
                <li class="active"><a href="#">部门管理 <span class="sr-only">(current)</span></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><!-- /.navbar-collapse -->
    </div><!-- /.container-fluid -->
</nav>
<div>
    <div class="container">
        <div >
            <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" style="margin-top: 10px" >
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>部门列表
                </h3>
            </div>
            <table class="table table-bordered">
                <thead>
                <tr>
                    <th>ID</th>
                    <th>部门名称</th>

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

                        </td>

                    </tr>
                {% endfor %}
                </tbody>
            </table>


        </div>


    </div>

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

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.min.css' %}">
</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>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav">
                <li class="active"><a href="#">部门管理 <span class="sr-only">(current)</span></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><!-- /.navbar-collapse -->
    </div><!-- /.container-fluid -->
</nav>
<div>
    <div class="container">


        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title">Panel title</h3>
            </div>
            <div class="panel-body">
                <form method="post" action="">
                    {% csrf_token %}
                    <div class="form-group">
                        <label for="exampleInputEmail1">标题</label>
                        <input type="text" class="form-control" id="exampleInputEmail1" placeholder="标题" name="title">
                    </div>


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

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

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.min.css' %}">
</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>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav">
                <li class="active"><a href="#">部门管理 <span class="sr-only">(current)</span></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><!-- /.navbar-collapse -->
    </div><!-- /.container-fluid -->
</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" action="">
                    {% csrf_token %}
                    <div class="form-group">
                        <label for="exampleInputEmail1">编辑</label>
                        <input type="text" class="form-control" id="exampleInputEmail1" placeholder={{ name }} name="title">
                    </div>


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

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

其中的edit动态

7 模版的继承

部门列表、添加、编辑这三个页面都有公共的部分,可以创建一个父类模板,父类模板中包含他们的公共部分,将每个页面中独有的部分放在block中。

定义模板

<!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.min.css' %}">
    {% block css %}
    
    {% endblock %}
</head>
<body>
<h1>begin</h1>
{% block content %}

{% endblock %}
<h1>end</h1>
<script src="{% static 'js/jquery-3.7.1.min.js' %}"></script>
{% block js %}

{% endblock %}
</body>
</html>

继承模版

{% extends 'i1.html' %}
{% block css %}

{% endblock %}
{% block content %}
    <div>内容</div>
{% endblock %}
{% block js %}

{% endblock %}
  • 每个模板可以创建多个block。类比于内容的继承,样式也可以继承,将公共使用的css、js样式放在模板页面中,然后各个子模板可以定义自己独有的样式

注意

1:form表单中要加上{% csrf_token %}
2:面板包裹的表格可能会导致表格和面板都有横线,解决办法是去掉table外面的example类的div标签
3:使用post请求的函数(edit和add)要根据请求方式分开处理

用户管理

插入数据
insert into app01_userinfo(name,password,age,account,create_time,gender,depart_id)values(“刘东”,“1234”,18,100.54,“2011-11-11”,1,1),(“王泓一”,“128246”,23,10000.54,“2023-01-01”,1,1),(“赵四”,“8877”,26,1314.54,“2022-11-11”,2,2);

    """员工表"""
    name=models.CharField(verbose_name="姓名",max_length=16)
    password=models.CharField(max_length=64)
    age=models.IntegerField()
    account=models.DecimalField(verbose_name="账户余额",max_digits=10,decimal_places=2,default=0)
    create_time=models.DateTimeField(verbose_name="入职时间")
 

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

def user_list(request):
    queryset=models.UserInfo.objects.all()
    # for obj in queryset:

        #obj.create_time是<class 'datetime.datetime'>类型,在Python中可以通过strftime("%Y-%m-%d")转换
        #gender存储的就是1,2但是由于是通过choices定义的,通过obj.get_gender_display()可以直接输出男女,但是这只是在python中
        #如果是连表可以models.Department.objects.filter(id=obj.depart_id).first().title
        #但是python提供了直接通过外键连表obj.depart获取depart对象,所以obj.depart.title就可以输出depart的title
        # print(obj.name,obj.password,obj.age,obj.account,obj.create_time,obj.gender,obj.depart_id,type(obj.create_time),obj.create_time.strftime("%Y-%m-%d"),obj.depart.title)
    return render(request,"user_list.html",{"queryset":queryset})

user_list.html

{% extends 'layout.html' %}
{% block content %}
    <div class="container">
        <div>
            <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" style="margin-top: 10px">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>用户列表
                </h3>
            </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>
{#                    模版语法中不需要加括号 |date:"Y-m-d H:i:s"#}
                        <td>{{ obj.id }}</td>
                        <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 href="" class="btn btn-primary btn-xs">编辑</a>
                            <a href="" class="btn btn-danger btn-xs">删除</a>
                        </td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
    </div>
{% endblock %}

新建用户
views.py函数

def user_add(request):
    if request.method == 'GET':
        context = {
            'gender_choices': models.UserInfo.gender_choices,
            "depart_list": models.Department.objects.all()
        }
    else:
        name = request.POST.get("name")
        pwd = request.POST.get("psw")
        age = request.POST.get("age")
        ac = request.POST.get("ac")

        ctime = request.POST.get("ctime")
        gd_id = request.POST.get("gd")
        dp_id = request.POST.get("dp")
        models.UserInfo.objects.create(name=name, password=pwd, age=age, account=ac, create_time=ctime, gender=gd_id,
                                       depart_id=dp_id)
    return redirect("/user/list/")

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" action="">
                    {% csrf_token %}
                    <div class="form-group">
                        <label for="exampleInputEmail1">姓名</label>
                        <input type="text" class="form-control" id="exampleInputEmail1" placeholder="标题" name="name">
                        <label for="exampleInputEmail1">密码</label>
                        <input type="text" class="form-control" id="exampleInputEmail1" placeholder="标题" name="psw">
                        <label for="exampleInputEmail1">年龄</label>
                        <input type="text" class="form-control" id="exampleInputEmail1" placeholder="标题" name="age">
                        <label for="exampleInputEmail1">余额</label>
                        <input type="text" class="form-control" id="exampleInputEmail1" placeholder="标题" name="ac">
                        <label for="exampleInputEmail1">入职时间</label>
                        <input type="text" class="form-control" id="exampleInputEmail1" placeholder="标题" name="ctime">
                        <label for="exampleInputEmail1">性别</label>
                        <select name="gd" id="" class="form-control">
                            {% for item in gender_choices %}
                                <option value={{ item.0 }}>{{ item.1 }}</option>
                            {% endfor %}
                        </select>
                        <label for="exampleInputEmail1">部门</label>
                        <select name="dp" id="" class="form-control">
                            {% 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 %}

原始方式思路:不采用(本质但麻烦)

1用户提交数据没有校验
2错误,页面上应该有错误提示
3要一个一个写
4关联的数据,手动去获取并循环展示在页面

dj组件
form组件(小简便)
modelform组件(简便)

8.1初识Form和modelform

其中的depart是一个对象,需要重写models中定义的类才能直接输出title

class Department(models.Model):
    def __str__(self):
        return self.title
from django import forms
class UserModelForm(forms.ModelForm):
    class Meta:
        model = models.UserInfo
        fields=["name","password","age","account","create_time","gender","depart"]#上面的代码除了UserInfo其他的都是固定模版
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        for name,field in self.fields.items():
            print(field,name)
            field.widget.attrs={"class":"form-control"}#这里添加每个输入的样式
def user_modelFormAdd(request):
    form=UserModelForm()
    return render(request,"user_modelFormAdd.html",{"form":form})
{% 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" action="">

                    {% csrf_token %}
                    {% for field in form %}
                        <div class="form-group">
                            <label for="">{{ field.label }}</label>
                            {#    {{ form.name.label }}:{{ form.name }}#}
                            {#    {{ form.password.label }}:{{ form.password }}#}
                            {#    {{ form.age.label }}:{{ form.age }} 不用像这样一个一个写#}
                            {{ field }}
                        </div>
                    {% endfor %}
                    <button type="submit" class="btn btn-primary">保 存</button>
                </form>
            </div>
        </div>
    </div>
{% endblock %}

在这里插入图片描述
提示的错误信息

更改错误提示信息为中文,在settings.py文件中更改

# LANGUAGE_CODE = "en-us"
LANGUAGE_CODE = "zh-hans"

在这里插入图片描述
下面是modelform实现的add用户的函数以及类的定义,写在views.py文件中

from django import forms
class UserModelForm(forms.ModelForm):
    name=forms.CharField(min_length=3,label="用户名")#重写字段,这样可以设置其他的约束给name字段,这里写的是最小长度为3
    password=forms.CharField(min_length=3,label="密码")#,validators=正则表达式验证
    class Meta:
        model = models.UserInfo
        fields=["name","password","age","account","create_time","gender","depart"]
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        for name,field in self.fields.items():
            print(field,name)
            field.widget.attrs={"class":"form-control"}
def user_modelFormAdd(request):
    if request.method=='GET':
        form=UserModelForm()
        return render(request,"user_modelFormAdd.html",{"form":form})
    else:
        form=UserModelForm(data=request.POST)
        if form.is_valid():
            print(form.cleaned_data)
            #{'name': '张成涛', 'password': 'w222', 'age': 23, 'account': Decimal('5'), 'create_time': datetime.datetime(2022, 11, 11, 0, 0, tzinfo=zoneinfo.ZoneInfo(key='UTC')), 'gender': 1, 'depart': <Department: 销售>}
            # models.UserInfo.objects.create(...)不需要这么写
            form.save()
            return redirect("/user/list/")
        else:
            # print(form.errors)
            return render(request,"user_modelFormAdd.html",{"form":form})#这次这个form和get返回的是不一样的,包含了错误信息

下面是对应的html文件,这里错误提示信息新内容比较多,重点在与使用modelform的逻辑,也就是views.py里面类的定义

{% 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" action="" novalidate>
{#这里的novalidate是把浏览器的错误提示关掉#}
                    {% csrf_token %}
                    {% for field in form %}
                        <div class="form-group">
                            <label for="">{{ field.label }}</label>
                            {#    {{ form.name.label }}:{{ form.name }}#}
                            {#    {{ form.password.label }}:{{ form.password }}#}
                            {#    {{ form.age.label }}:{{ form.age }}#}
                            {{ field }}
                            <span style="color: red"> {{ field.errors.0 }}</span>
{#                        错误信息很多,我们只需要第0个就行#}
                        </div>
                    {% endfor %}
                    <button type="submit" class="btn btn-primary">保 存</button>
                </form>
            </div>
        </div>
    </div>
{% endblock %}
  • modelform针对数据库中的某个表
  • form

8.4编辑用户

点击编辑,跳转到编辑页面,原来的ID携带过去
编辑后需要检查和提示错误,提交后更新到数据库中
先修改list中的编辑a标签的href

<a href="/user/{{ obj.id }}/edit/" class="btn btn-primary btn-xs">编辑</a>

视图文件中的编辑函数和添加函数大差不差,只是多了一个instance的使用需要注意一下

def user_edit(request, eid):
    row_obj = models.UserInfo.objects.filter(id=eid).first()
    if request.method == 'GET':

        form = UserModelForm(instance=row_obj)
        return render(request, "user_edit.html", {"form": form})
    else:

        form = UserModelForm(data=request.POST, instance=row_obj)  # 这里不能再是直接save了,需要加一个instance,否则就是直接添加了一行
        if form.is_valid():
            #默认是用户输入的所有数据,如果有不希望用户输入且希望保存的
            #form.instance.字段名=123
            form.save()
            return redirect("/user/list/")
        else:
            # print(form.errors)
            return render(request, "user_modelFormAdd.html", {"form": form})  # 这次这个form和get返回的是不一样的,包含了错误信息

编辑的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" action="" novalidate>
{#这里的novalidate是把浏览器的错误提示关掉#}
                    {% csrf_token %}
                    {% for field in form %}
                        <div class="form-group">
                            <label for="">{{ field.label }}</label>
                            {#    {{ form.name.label }}:{{ form.name }}#}
                            {#    {{ form.password.label }}:{{ form.password }}#}
                            {#    {{ form.age.label }}:{{ form.age }}#}
                            {{ field }}
                            <span style="color: red"> {{ field.errors.0 }}</span>
{#                        错误信息很多,我们只需要第0个就行#}
                        </div>
                    {% endfor %}
                    <button type="submit" class="btn btn-primary">保 存</button>
                </form>
            </div>
        </div>
    </div>
{% endblock %}

8.5删除

这个很简单,urls里面添加一个,views里面两行搞定

def user_delete(request, eid):
    models.UserInfo.objects.filter(id=eid).delete()
    return redirect("/user/list/")
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值