django ORM数据的增删改查,django的请求生命周期图,路由层相关 #day52

django ORM数据的增删改查

一、模板语法分配变量

1.在urls.py中增加index的路由

2.view.py中定义函数方法,以及增加数据

from django.shortcuts import render

# Create your views here.

def index(request):
   user_dic = {'name': 'yuziqi', 'age': 18}
   user_dic1 = {'name': 'yuziqi', 'age': 18}
   user_dic2 = {'name': 'yuziqi', 'age': 18}
   user_dic3 = {'name': 'yuziqi', 'age': 18}
   user_dic4 = {'name': 'yuziqi4', 'age': 18}

   # 第一种方式
   # return render(request, 'index.html', {'user_dic': user_dic})

   # 第二种方式
   print(locals())
   return render(request, 'index.html', locals())

3.创建index.html将html文件返回显示在浏览器中

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
   <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
   <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h1>index</h1>
{{ user_dic }}
{{ user_dic.name }}
{{ user_dic4 }}
{{ user_dic4.name }}
</body>
</html>

二、注册功能实现

1、在models.py中创建User类,并连接数据库得到一个表

from django.db import models

# Create your models here.

class User(models.Model):
   # 主键 id int primary key auto_increment
   # id = models.AutoField(primary_key=True)
   """
      如果你的主键字段就叫id,那么你就可以省略不写,django会自动帮你创建一个字段为id的主键
      但是,如果你的主键字段名不叫id,你就需要自己手动书写了
  """
   # uid = models.AutoField(primary_key=True)
   name = models.CharField(max_length=64)
   password = models.CharField(max_length=64, null=True)

 

2、

from django.shortcuts import render, redirect

from app01 import models
# Create your views here.

def index(request):
   user_dic = {'name': 'yuziqi', 'age': 18}
   user_dic1 = {'name': 'yuziqi', 'age': 18}
   user_dic2 = {'name': 'yuziqi', 'age': 18}
   user_dic3 = {'name': 'yuziqi', 'age': 18}
   user_dic4 = {'name': 'yuziqi4', 'age': 18}

   # 第一种方式
   # return render(request, 'index.html', {'user_dic': user_dic})

   # 第二种方式
   print(locals())
   return render(request, 'index.html', locals())

def login(request):
   return render(request, 'login.html')


# 注册功能
def register(request):
   # post方式
   # if request.method == 'POST':

   return render(request, 'register.html')

def do_reg(request):
   # 接收请求参数
   if request.method == 'POST':
       username = request.POST.get('username')
       password = request.POST.get('password')
       # 入库操作 models.User => 指定表名
     # 第一种添加数据的方式
       models.User.objects.create(name=username, password=password)

     # res =
models.User.objects.create(name=username, password=password)
      这里的res是其返回值(返回影响的行数)
     # 第二种添加数据的方式
      user_obj = models.User(name=username, password=password) # 得到的是对象,没有操作数据库
      user_obj.save()  # 才真正操作了数据库 
      
       # 跳转到登录页面
       return redirect('/login/')

3、在路由urls.py文件中添加路由

4、分别在templates文件家中创建index.html, login.html, register.html

index.html

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
   <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
   <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h1>index</h1>
{{ user_dic }}
{{ user_dic.name }}
{{ user_dic4 }}
{{ user_dic4.name }}
</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
   <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
   <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h1>登录页面</h1>
</body>
</html>

register.html

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
   <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
   <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
   <h1 align="center">注册页面</h1>
   <div class="container-fluid">
       <div class="row">
           <div class="col-md-8 col-md-offset-2">
               <form action="/do_reg/" method="post">
                   <p>username:<input type="text" name="username" class="form-control"></p>
                   <p>password:<input type="text" name="password" class="form-control"></p>
                   <input type="submit" class="btn btn-success btn-block">
               </form>
           </div>
       </div>
   </div>
</body>
</html>

三、数据展示

1、

# 展示所有数据
def userlist(request):
   # 查询所有数据
   """
  QuerSet对象
  <QuerySet [<User: User object>]>
  """
   # 第一种方式
   # userlist = models.User.objects.filter()  # 在这里相当于SQL语句中的where

   # 第二种方式
   userlist = models.User.objects.all()
   # 如果只需要一条数据,可以用first()(一般用于修改中用)
   # userlist = models.User.objects.all().first()

   # 只展示yuziqi的
   # SQL语句 select * from user where name = 'yuziqi' and password = '123'
   # filter()括号中默认就是and关系
   # userlist = models.User.objects.filter(name='yuziqi', password=123).all()
   # 只要是返回QuerySet对象,那么你就可以点下去,其中的filter中的条件也是and关系
   userlist = models.User.objects.filter(name='yuziqi').filter(password=123).all()
   print(userlist)
   """
  <QuerySet [<User: jack>]>
  """
   return render(request, 'userlist.html', locals())

2、

from django.db import models

# Create your models here.

class User(models.Model):
   # 主键 id int primary key auto_increment
   # id = models.AutoField(primary_key=True)
   """
      如果你的主键字段就叫id,那么你就可以省略不写,django会自动帮你创建一个字段为id的主键
      但是,如果你的主键字段名不叫id,你就需要自己手动书写了
  """
   # uid = models.AutoField(primary_key=True)
   name = models.CharField(max_length=64)
   password = models.CharField(max_length=64, null=True)

   # 每次打印对象时返回name值
   def __str__(self):
       return self.name

3、

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
   <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
   <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</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 obj in userlist %}
                           <tr>
                               <td>{{ obj.id }}</td>
                               <td>{{ obj.name }}</td>
                               <td>{{ obj.password }}</td>
                           </tr>
                      {% endfor %}
                   </tbody>
               </table>
           </div>
       </div>
   </div>
</body>
</html>

四、修改数据

1、定义函数方法

# 修改
def edit_user(request):
   edit_id = request.GET.get('id')

   # 查询数据
   edit_data = models.User.objects.filter(id=edit_id).first()
   # print(edit_data)
   # print(edit_data.password)
   # print(edit_data.name)
   if request.method == 'POST':
       username = request.POST.get('username')
       password = request.POST.get('password')

       # update user set name=name where id=edit_id
     # 第一种方式
       models.User.objects.filter(id=edit_id).update(name=username, password=password)
     # 第二种方式
     user_obj = models.User.objests.filter(id=edit_id).first()  # 对象
     user_obj.name = username
     user_obj.password = password
     user_obj.save()  # 才操作数据库

       return redirect('/userlist/')
   return render(request, 'edit.html', locals())

2、在userlist.html文件中增加表头“操作”与a链接获取所要操作的id值

                  <tbody>
                      {% for obj in userlist %}
                           <tr>
                               <td>{{ obj.id }}</td>
                               <td>{{ obj.name }}</td>
                               <td>{{ obj.password }}</td>
                               <td>
                                   <a href="/edit_user/?id={{ obj.id }}" class="btn btn-primary">修改</a>
                                   <a href="/delete_user/?id={{ obj.id }}" class="btn btn-danger">删除</a>
                               </td>
                           </tr>
                      {% endfor %}
                   </tbody>

3、创建一个修改页面edit.html(参考前面的注册界面)

4、添加路由

五、删除数据

1、创建函数方法

def delete_user(request):
   # 要删除的数据记录id
   del_id = request.GET.get('id')
   """
      删除有两种方式:
          1、物理删除
          2、软删除
  """
   # sql语句 delete from user where id = del_id
   # 1、物理删除
   # models.User.objects.filter(id=del_id).delete()

   # 2、软删除
   models.User.objects.filter(id=del_id).update(is_delete=True)
   return redirect('/userlist/')

2、添加路由

orm创建表关系

class Book(models.Model):
title = models.CharField(max_length=32)
# price decimal(8,2) 八位数字,其中有两位是小数
price = models.DecimalField(max_digits=8, decimal_places=2)

# 建立一对多关系,默认跟另外一张表的主键进行关联
# publish = models.ForeignKey(to='Publish' to_field='a_id')
publish = models.ForeignKey(to='Publish')

# 多对多关系
authors = models.ManyToManyField(to='Author')
"""
author是一个虚拟字段,不会创建author字段
"""


class Publish(models.Model):
title = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
# a_id = models.IntegerField(max_length=32)

class Author(models.Model):
name = models.CharField(max_length=32)
# 一对一关系
detail = models.OneToOneField(to='AuthorDetail')

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

django的请求生命周期图

路由层相关的

1、url函数第一个是匹配正则
django2.x以上,
path写什么就是什么多一个或少一个都不行
re_path => url/

2、如何添加一个首页
# 首页
urlpatterns = [
   # 添加一个首页
   url(r'^$', views.home)  # 以空开头,以空结尾
   
   url(r'^admin/', admin.site.urls),
   url(r'^index/', views.index),
   url(r'^register/', views.register),
   url(r'^do_reg/', views.do_reg),
   url(r'^login/', views.login),
   # 用户列表
   url(r'^userlist/', views.userlist),
   
   url(r'^edit_user/', views.edit_user),
   url(r'^delete_user/', views.delete_user),
   url(r'^func/', views.func),
   url(r'^home', views.home)
]

 

posted @ 2021-08-11 22:51  Gnomeshghy  阅读(201)  评论(0)    收藏  举报