Django ORM记录的增删改查结合web端

模版语法分配变量

在views.py文件中定义一个视图函数show_data:

def show_data(request):
  # 定义一个字典 并将它展示在前端HTML文件
    user_dic = {'name': 'jesse', 'age': '18'}
    return render(request, 'show_data.html', {'user_dic': user_dic})

在templates文件夹内创建show_data.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>展示数据</title>
</head>
<body>
    <H1>GET DATA!</H1>
    <p>{{ user_dic }}</p>
    <p>{{ user_dic.age }}</p>
    <p>{{ user_dic.name }}</p>
</body>
</html>

用{ {user_dic} }就可以在html页面将视图函数内定义的字典展示出来了,传过去的是字典可以.key将values取出来,如果是列表可以.index

将列表中的值取出。需要注意的是,html里面的user_dic是视图函数内的key值。

如果需要传到前端的数据过多可以使用locals语法,将函数内所有的局部变量传过去:

    return render(request, 'show_data.html', locals())
# 前端模版语法都是一样的 双中括号

Django添加记录到表——简易注册功能

首先在models.py建一张user表

from django.db import models


# Create your models here.
class User(models.Model):
    username = models.CharField(max_length=32)
    password = models.IntegerField()

写好html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>register</title>
    <style>
        #d1{
            height: 106px;
            width: 100%;
            color: rgb(90,159,213);
        }
    </style>
    {% load static %}
    <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>
    <div id="d1"></div>
    <h1 class="text-center">注册</h1>
    <div class="container-fluid">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <form action="" method="post">
                    <p><input type="text" placeholder="用户名" name="username" class="form-control"></p>
                    <p><input type="password" placeholder="密码(区分大小写)" name="password" class="form-control"></p>
                     <input type="submit" value="注册" class="btn btn-success btn-block">
                </form>
            </div>
        </div>
    </div>
</body>
</html>

register视图函数:

from app_user import models
# 这里因为要通过操作models.py里面的User类所以要导入


def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
       # 入库操作,指定表名User
      models.User.objects.create(username=username, password=password) # 写入操作 前面的username是字段名
        return redirect('/login/')
    return render(request, 'register.html')

Django查询数据——展示数据到页面

首先在views.py定义一个视图函数:

def edit_user(request):
    user_list = models.User.objects.all()
    print(user_list)
    """
    user_list得到的是一个对象列表
    <QuerySet [<User: User object>, <User: User object>, <User: User object>]>
    三个对象,就表示有三条记录 在html页面得到它,再for循环,点出里面想要的数据
    """
    return render(request, 'edit_user.html', locals())

HTML页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>编辑用户</title>
    {% load static %}
    <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>
    <h1 class="text-center">用户信息表</h1>
    <div class="container-fluid">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <table class="table table-striped table-hover">
                  <thead>
                    <tr>
                        <th>ID</th>
                        <th>username</th>
                        <th>password</th>
                    </tr>
                  </thead>
                   <tbody>
                   {% for user_obj in user_list %}
{#                      for table出js语法 #}
                       <tr>
                        <td>{{ user_obj.id }}</td>
{#                      这里面展示后端获取来的数据要加双中括号 #}
                        <td>{{ user_obj.username }}</td>
                        <td>{{ user_obj.password }}</td>
                       </tr>
                        {% endfor %}
                   </tbody>
                </table>
            </div>
        </div>
    </div>
</body>
</html>

展示结果:

image

objects.all()方法和objects.filter()是一样的效果,在filter不加限制条件的时候,filter相当于SQL语句里面的where,起筛选条件,filter括号内的条件如果用逗号隔开,表示的是and关系。

def edit_user(request):
    # 筛选出username字段记录为jesse的记录
  user_list = models.User.objects.filter(username='jesse').filter(password='123')
  # filter返回的是一个对象,所以它可以一直点下去
  return render(request, 'edit_user.html', locals())

image

Django修改数据——在web端修改

在之前的查看HTML页面添加两个a标签,将ID分别代进去

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>编辑用户</title>
    {% load static %}
    <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>
    <h1 class="text-center">用户信息表</h1>
    <div class="container-fluid">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <table class="table table-striped table-hover">
                  <thead>
                    <tr>
                        <th>ID</th>
                        <th>username</th>
                        <th>password</th>
                        <th>操作</th>
                    </tr>
                  </thead>
                   <tbody>
                   {% for user_obj in user_list %}
{#                      for table出js语法 #}
                       <tr>
                        <td>{{ user_obj.id }}</td>
{#                      这里面展示后端获取来的数据要加双中括号 #}
                        <td>{{ user_obj.username }}</td>
                        <td>{{ user_obj.password }}</td>
                        <td>
                            <a href="/delete_user/?id={{ user_obj.id }}" class="btn btn-danger">删除</a>
  {# 这里可以获取到id #}
                            <a href="/alter_user/?id={{ user_obj.id }}" class= "btn btn-outline-warning">修改</a>
                        </td>
                       </tr>
                        {% endfor %}
                   </tbody>
                </table>
            </div>
        </div>
    </div>
</body>
</html>

在views.py文件内定义视图函数:

ef alter_user(request):
    alter_id = request.GET.get('id')
    # GET方法得到参数 前面查看页面传过来的id
    
    alter_data = models.User.objects.filter(id=alter_id).first()
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        models.User.objects.filter(id=alter_id).update(username=username, password=password)
       # update方法可以更新数据
        return redirect('/check_user/')
    return render(request, 'alter_user.html', locals())

再定义html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>修改用户信息</title>
    {% load static %}
    <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>
        <h1 class="text-center">修改用户信息表</h1>
    <div class="container-fluid" style = 'text-align: center'>
        <div class="row">
            <div class="col-md-8 col-md-offset-2 div01">
                <table class="table table-striped table-hover">
                  <thead>
                    <tr>
                        <th>ID</th>
                        <th>username</th>
                        <th>password</th>
                        <th>操作</th>
                    </tr>
                  </thead>
                   <tbody>
                    <tr>
                        <form action="" method="post">
                            <td>{{ alter_id }}</td>
                            <td><input type="text" value="{{ alter_data.username }}" name='username'></td>  # 模版语法获取到值
                            <td><input type="text" value="{{ alter_data.password }}" name='password'></td>
                            <td><input type="submit" value="保存" class="btn btn-primary"></td>
                        </form>
                    </tr>
                   </tbody>
                </table>
            </div>
        </div>
    </div>
</body>
</html>

删除数据

删除的方式有两种,物理删除和软删除,物理删除直接有delete方法,软删除我们可以加一个字段,用来标记数据,然后将每删除标记的数据过滤出来。不推荐用物理删除。

# 物理删除
def delete_user(request):
  # 获取要删除记录的id
  del_id = request.GET.get('id')
  models.User.objects.filter(id = del_id).delete()
  return redirect('/check_user/')

软删除

先在models.py 文件内添加字段

# 通过添加字段 is_delete
class User(models.Model):
    username = models.CharField(max_length=32)
    password = models.IntegerField()
    is_delete= models.BooleanField(default=0) # 存布尔值,其实存的是0和1 0表示F 1表示T
    
    
    # 添加完成之后执行迁移命令
    python3 manage.py makemigrations
    python3 manage.py migrate
# 改变 is_delete 字段的值 标记删除
def delete_user(request):
  del_id = request.GET.get('id')
  models.User.objects.filter(id=del_id).update(is_delete=True)
  return redirect('/check_user/')

这时候为了让查询时被标记记录不显示还应该过滤is_delete=True的记录。

总结:

# 创建记录
models.定义的类名(即表名).objects.create(字段名=记录...)

# 查询记录
models.定义的类名(即表名).objects.all() # 查询所有
# filter中的条件并列关系
models.定义的类名(即表名).objects.filter(筛选条件,筛选条件)

# 升级记录
models.定义的类名(即表名).objects.updata(字段名=new记录)
# 一般更新数据都要进行条件过滤,否则会将该字段所有数据全部更新掉

ORM创建表关系

创建表关系先创建每张表的基础字段,除了关系字段之外的字段先写好。

class Books(models.Model):
    title = models.CharField(max_length=32)
    # 相当于 price decimal(8,2)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    # 建立1对多关系,外键在多的一方
    publish = models.ForeignKey(to='Publish')
    # 默认和另一张表主键关联 如果要和其它字段关联传to_filed=该字段名
    # 多对多关系 书与作者
    authors = models.ManyToManyField(to='Author')
    """
    authors是一个虚拟字段,不会创建,其实它是一个对象
    """


class Publish(models.Model):
    publisher_name = models.CharField(max_length=32)
    address = models.CharField(max_length=64)


class Author(models.Model):
    name = models.CharField(max_length=32)
    # 一对一关系 一个作者对应一个作者详情
    detail_id = models.OneToOneField(to='AuthorDetail')


class AuthorDetail(models.Model):
    phone = models.CharField(max_length=32)
    email = models.EmailField()  # email varchar(254)

ForeignKey和OneToOneField 会自动在外键字段添加上_id.

总结:

ForeignKey  一对多外键 
ManyToManyField   多对多
OneToOneField   一对一
都需要表明to哪张表

Django请求生命周期图

image

路由介绍

在Django1.x版本urls.py中的路由是正则匹配

url(r'^admin/', admin.site.urls),

# 上尖号表达的是以admin/开头

# Django2.x版本以上用的是:
path  严格匹配写什么就是什么
re_path 等价于1.x版本中的url

# 首页路径写法
url(r'^$', views.home)
posted @ 2021-08-12 16:02  popopop  阅读(65)  评论(0)    收藏  举报