django的ORM操作 删除和编辑实现详解

向server端传送数据

有2中方法,1 是 通过url 地址, 2 是通过路径

向server端传参数方式

1,通过数据 http://127.0.0.1:8000/blog/?id=2

2, 通过路径 http://17.0.0.1:8000/blog/20

# url(r'blog/(\d{4})')

删除功能:

在url文件中,创建一个delbook路径, 通过url的地址拿到id实现删除

urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^$',views.index),#指定一个根目录,也指向index页面
  url(r'^index/$',views.index),
  url(r'^addbook/$',views.addbook),
  url(r'^delbook/$',views.delbook), -------------------------------------------del删除功能,对应视图函数
  #(\d+)分组后,作为参数传给editorbook函数,editorbook(request,1或2 等等)
  url(r'^editorbook/(\d+)',views.editorbook),
]

在index.html 页面中,点击删除按钮,在href 加上?id={{ book.id}}要删除的书籍,

在get请求时,url加上删除时点击到的id,获取id,就可以删除#}

<a href="/delbook/?id={{ book.id }}" rel="external nofollow" rel="external nofollow" ><button class="btn btn-primary">删除</button></a>

在删除一条记录后,页面的顺序是错乱,在前端显示的是数据库的id,用forloop.counter 默认从1开始循环显示,与数据库的id无关,

<td>{{ forloop.counter }}</td>

{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <link rel="stylesheet" href="{% static '/bootstrap-3.3.7/dist/css/bootstrap.css/' %}" rel="external nofollow" >

  <style>

    .container{
      margin-top: 50px;
    }
  </style>

</head>
<body>
<div class="container">
  <div class="row">

    <div class="col-md-8 col-md-offset-2">

    <table class="table table-striped">
      <tr>
        <th>ID</th>
        <th>书名</th>
        <th>价格</th>
        <th>出版日期</th>
        <th>作者</th>
        <th>出版社</th>
        <th>分类</th>
        <th>操作</th>
      </tr>

       {% for book in book_list %}
      <tr>

{# 在前端显示的是数据库的id,用forloop.counter 默认从1开始循环显示,与数据库的id无关,   <td>{{ book.id }}</td>#}
          <td>{{ forloop.counter }}</td>--------------------按照顺序显示,
          <td>{{ book.name }}</td>
          <td>{{ book.price }}</td>
          <td>{{ book.Date }}</td>
          <td>{{ book.auth }}</td>
          <td>{{ book.publish }}</td>
          <td>{{ book.classification }}</td>
          <td>
{#            当前的ip和端口都可以省略,会自动添加,a标签会访问addbook路径#}
             <a href="/addbook/" rel="external nofollow" ><button class="btn btn-primary">添加</button></a>
{#             在get请求时,url加上删除时点击到的id,获取id,就可以删除#}
             <a href="/delbook/?id={{ book.id }}" rel="external nofollow" rel="external nofollow" ><button class="btn btn-primary">删除</button></a>
{#             取到路径,#}
            <a href="/editorbook/{{ book.id }}" rel="external nofollow" ><button class="btn btn-primary">编辑</button></a>
          </td>d

      </tr>
      {% endfor %}
    </table>
  </div>
 </div>
</div>
</body>
<script>
</script>
</html>

在views文件中,编辑delbook函数,

django里的删除和编辑,前提都是 要先找到,利用filter()方法,条件是id或者是name,等都可以,

步骤1,用get的方法,从url路径中拿到id,

步骤2,对数据库的id和要url里获取到的id,对应,就执行delete()方法,就删除指定的记录,数据库也会减少一条记录,

#删除和修改,都是要先找到记录(对象)
def delbook(request):

  #先过滤,加上过滤的条件,然后用delete()
  #向server端传参数方式
  #1,通过数据 http://127.0.0.1:8000/blog/?id=2
  #2, 通过路径 http://17.0.0.1:8000/blog/20
            # url(r'blog/(\d{4})')
  #在前端页面加上id值,{{book.id}}

  #通过url获取iD,是get的方法,"id"是url里的key,
  id = request.GET.get("id")
  #前面的id是表里的字段,把get从地址栏里获取到的id赋值给表里的id,就可以删除
  #
  Book.objects.filter(id = id).delete()

  return redirect('/index/')

=======

ORM的编辑功能

在url文件中创建editorbook路径,和映射到视图函数,

通过访问的路径,拿到id,

urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^$',views.index),#指定一个根目录,也指向index页面
  url(r'^index/$',views.index),
  url(r'^addbook/$',views.addbook),
  url(r'^delbook/$',views.delbook), -------------------------------------------del删除功能,对应视图函数
  #(\d+)分组后,作为参数传给editorbook函数,editorbook(request,1或2 等等)
  url(r'^editorbook/(\d+)',views.editorbook),-----------------------------editorbook 编辑功能,对应一个视图函数
]

编辑一个editorbook页面,

编辑时要获取要编辑的是哪个对象,

比如:blog/20 ,20就是要获取到的id

通过路径 http://17.0.0.1:8000/blog/20

  # url(r'blog/(\d{4})')

{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <link rel="stylesheet" href="{% static '/bootstrap-3.3.7/dist/css/bootstrap.css/' %} " rel="external nofollow" >

  <style>
    .container{
      margin-top: 50px;
    }
  </style>

</head>
<body>

<div class="container">

  <div class="row">

    <div class="col-md-6 col-md-offset-2">
{#      {{ csrf-token }}#}

{#      以post的方法提交数据,走到editbook 视图函数#}
      <form class=editorbook" action="/editorbook/{{ book_obj.id }}/" method="post"> -----------加上从数据库里拿到的id号,

{#      当点击添加按钮时,是执行视图函数,在数据库中添加一条记录,然后再把这个记录添加到index页面#}

      <div class="form-group">
        <label for="bookname">书名:</label>
        <input type="text" class="form-control" id="bookname" name="bookname" value="{{ book_obj.name }}">
      </div>
      <div class="form-group">
        <label for="price">价格:</label>
        <input type="text" class="form-control" id="price" name="price" value="{{ book_obj.price }}">
      </div>
      <div class="form-group">
        <label for="Date">日期:</label>
        <input type="text" class="form-control" id="Date" name="Date" value="{{ book_obj.Date }}">
      </div>
      <div class="form-group">
        <label for="auth">作者:</label>
        <input type="text" class="form-control" id="auth" name="auth" value="{{ book_obj.auth }}">
      </div>

      <div class="form-group">
        <label for="publish">出版社:</label>
        <input type="text" class="form-control" id="publish" name="publish" value="{{ book_obj.publish }}">
      </div>

      <div class="form-group">
        <label for="publish">分类:</label>
        <input type="text" class="form-control" id="publish" name="classification" value="{{ book_obj.classification }}">
      </div>

      <input class="btn btn-info" type="submit" value='提交'>

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

</div>

</body>

</html>

在views文件中,撰写editorbook函数,

表单的提交是post 方法,用post的方法获取到每个输入框的值, 然后保存到数据库

def editorbook(request,id):

# 2, 通过路径 http://17.0.0.1:8000/blog/20
# url(r'blog/(\d{4})')
#通过id获取要修改的对象,在前端中把对象的每个字段属性给value,就可以在input框显示要编辑的值
  # book_obj = Book.objects.filter(id = id)[0]
  book_obj = Book.objects.filter(id = id).first()

  if request.method == "POST":
    bookname = request.POST.get('bookname')
    price = request.POST.get('price')
    Date = request.POST.get('Date')
    auth = request.POST.get('auth')
    publish = request.POST.get('publish')
    classification = request.POST.get('classification')

    #方法2 update修改并保存数据 ,name 是数据库的字段,bookname是前端form表单里 的name属性值,把输入框里获取到的值给数据库的字段进行保存,
    Book.objects.filter(id = id).update(name = bookname,price = price, Date = Date, auth = auth , publish = publish, classification = classification)

    return redirect('/index/')

  return render(request,'editorbook.html',{'book_obj':book_obj})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python的Django框架中forms表单类的使用方法详解

    Form表单的功能 自动生成HTML表单元素 检查表单数据的合法性 如果验证错误,重新显示表单(数据不会重置) 数据类型转换(字符类型的数据转换成相应的Python类型) Form相关的对象包括 Widget:用来渲染成HTML元素的工具,如:forms.Textarea对应HTML中的<textarea>标签 Field:Form对象中的一个字段,如:EmailField表示email字段,如果这个字段不是有效的email格式,就会产生错误. Form:一系列Field对象的集合,负责验证和

  • django 常用orm操作详解

    Django流程: 1 创建Django项目 : django-admin startproject projectname 2 创建应用: : python manage.py startapp appname 3 在控制器(urls.py)创建 url 与 视图函数的映射关系(一一对应) 4 创建视图函数,完成逻辑代码 5 从数据库取出集合对象 5 把数据库变量嵌入到模板进行渲染(render方法) 6 将渲染后的html页面返回给客户端 URL:协议+域名+端口+路径 协议:http 域名

  • Django视图之ORM数据库查询操作API的实例

    查询表记录 查询相关API 操作:models.表名.objects.方法() <BR>all(): 查询所有结果 filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个, 如果符合筛选条件的对象超过一个或者没有都会抛出错误. exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 values(*field): 返回一个ValueQuerySet--一个特殊的QuerySet

  • Django框架orM与自定义SQL语句混合事务控制操作

    本文实例讲述了Django框架orM与自定义SQL语句混合事务控制操作.分享给大家供大家参考,具体如下: 用单纯的ORM 或者单纯的自定义SQL语句,都比较好控制事务.在前面的一篇文章中已经讲过Django事务小结 ,但里面没有提到在同一个方法里面既有ORM 又有 自定义SQL 语句的情况. 如果是单纯的ORM ,可以这样做,假设已经定义好model, User,Category. from django.db import transaction ... @commit_on_success

  • Django基于ORM操作数据库的方法详解

    本文实例讲述了Django基于ORM操作数据库的方法.分享给大家供大家参考,具体如下: 1.配置数据库 vim settings #HelloWorld/HelloWorld目录下 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #mysql数据库中第一个库test 'NAME': 'test', 'USER': 'root', 'PASSWORD': '123456', 'HOST':'127.0.0.1', '

  • django的ORM操作 删除和编辑实现详解

    向server端传送数据 有2中方法,1 是 通过url 地址, 2 是通过路径 向server端传参数方式 1,通过数据 http://127.0.0.1:8000/blog/?id=2 2, 通过路径 http://17.0.0.1:8000/blog/20 # url(r'blog/(\d{4})') 删除功能: 在url文件中,创建一个delbook路径, 通过url的地址拿到id实现删除 urlpatterns = [ url(r'^admin/', admin.site.urls),

  • django ORM之values和annotate使用详解

    任务需求:项目中有个问题表,存储所有的问题,以_id为编号,由于_id未做唯一校验,所以早期数据有多个问题使用同一编号的情况. 需求就是找出编号有重复的数据,只保留第一个 开始之前 使用了values和annotate两个函数 简单的来说values可以理解成展示models指定列的值 annotate起到了group by的作用, 所以我做的事就是对指定字段按个数进行统计,然后留下重复编号的数据,进行清洗 看看数据库数据 查看每条数据的_id的值 对_id数据条数进行统计 转换数据格式为lis

  • Python Django给admin添加Action的方法实例详解

    在使用Django自带的admin后台的时候,他提供了一些默认的指令可以对数据进行操作, 比如批量删除,修改等 同样的我们也可以添加自己的指令. 创建一个Django项目 $ django-admin startproject DjangoActions $ cd DjangoActions $ python3 manage.py startapp mysite添加model 打开mysite下的models.py from django.db import models class Artic

  • 对Django中内置的User模型实例详解

    User模型 User模型是这个框架的核心部分.他的完整的路径是在django.contrib.auth.models.User. 字段 内置的User模型拥有以下的字段: 1.username: 用户名.150个字符以内.可以包含数字和英文字符,以及_.@.+..和-字符.不能为空,且必须唯一! 2.first_name:歪果仁的first_name,在30个字符以内.可以为空. 3.last_name:歪果仁的last_name,在150个字符以内.可以为空. 4.email:邮箱.可以为空

  • Django ForeignKey与数据库的FOREIGN KEY约束详解

    数据库在高并发的场景下使用外键约束会有锁问题并且使用外键会增加运维成本,所以很多公司都规定生产环境的数据库禁止使用外键. 那么不使用外键约束的情况下使用 Django ORM 如何实现关联查询两个表呢?这曾是困扰我很久的一个问题,今天终于找到了答案,写出来分享一下. Django 的 ForeignKey 和数据库的 FOREIGN KEY 并不一样.Django 的 ForeignKey 是一种逻辑上的两个表的关联关系,可以指定是否使用数据库的 FOREIGN KEY 约束. 在开头提到的场景

  • DBeaver操作所有数据库管理工具使用详解

    目录 引言 一.关于 DBeaver 二.安装 DBeaver 三.管理数据源 四.管理表 01.查看表 02.新增表 五.执行 SQL 六.外观配置 七.总结 引言 作为一名开发者,免不了要和数据库打交道,于是我们就需要一款顺手的数据库管理工具.很长一段时间里,Navicat 都是我的首选,但最近更换了一台新电脑,之前的绿色安装包找不到了. 于是就琢磨着,找一款免费的,功能和 Navicat 有一拼的数据库管理工具来替代.好朋友 macrozheng 给我推荐了 DBeaver,试用完后体验真

  • NodeJS Express使用ORM模型访问关系型数据库流程详解

    目录 一.ORM模型 二.在Node中ORM的实现 一.ORM模型 设计思想,主要目的是简化计算机程序访问数据库 1.ORM:对象关系模型(对象关系映射) Object Releastion Model,将程序中的对象和数据库中关系(表格)进行映射.可以使开发者在程序中方便的对数据库进行操作(用户在程序操作对对象实际就是操作数据库的表格) 2.ORM的映射关系: (1)程序中的模型(即为类) <——>表名 (2)模型的类型(类中定义的属性)<——> 表的列 (3)由模型创建的对象(

  • CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解

    CodeIgniter 是一个小巧但功能强大的 PHP 框架,作为一个简单而"优雅"的工具包,它可以为开发者们建立功能完善的 Web 应用程序.是比较主流的一个PHP框架. 下面给大家介绍CI框架(ajax分页,全选,反选,不选,批量删除)完整代码,具体代码如下所示: //ajax分页+搜索(视图层) function ajax_page(page){ var sou = $('#sou').val(); $.ajax({ type: "POST", dataTyp

随机推荐