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


Posted in Python onJuly 24, 2019

向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})

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

Python 相关文章推荐
为Python的web框架编写前端模版的教程
Apr 30 Python
python类和函数中使用静态变量的方法
May 09 Python
Python 编码Basic Auth使用方法简单实例
May 25 Python
python opencv之SURF算法示例
Feb 24 Python
python3 遍历删除特定后缀名文件的方法
Apr 23 Python
django url到views参数传递的实例
Jul 19 Python
django最快程序开发流程详解
Jul 19 Python
pycharm配置git(图文教程)
Aug 16 Python
Django实现从数据库中获取到的数据转换为dict
Mar 27 Python
jupyter notebook 实现matplotlib图动态刷新
Apr 22 Python
python Cartopy的基础使用详解
Nov 01 Python
Python+Selenium自动化环境搭建与操作基础详解
Mar 13 Python
Django如何简单快速实现PUT、DELETE方法
Jul 24 #Python
django一对多模型以及如何在前端实现详解
Jul 24 #Python
详解Python是如何实现issubclass的
Jul 24 #Python
Django中在xadmin中集成DjangoUeditor过程详解
Jul 24 #Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
Jul 24 #Python
Django 创建/删除用户的示例代码
Jul 24 #Python
python3.6+django2.0+mysql搭建网站过程详解
Jul 24 #Python
You might like
文件系统基本操作类
2006/11/23 PHP
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
php7安装yar扩展的方法详解
2017/08/03 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
Javascript代码实现仿实例化类
2015/04/03 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
JavaScript实现动态删除列表框值的方法
2015/08/12 Javascript
Select下拉框模糊查询功能实现代码
2016/07/22 Javascript
JS简单实现浮动窗口效果示例
2016/09/07 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
QRCode.js二维码生成并能长按识别
2018/10/16 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
[01:54]TI珍贵瞬间系列(三):翻盘
2020/08/28 DOTA
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
Numpy之将矩阵拉成向量的实例
2019/11/30 Python
Pycharm小白级简单使用教程
2020/01/08 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
Python环境管理virtualenv&amp;virtualenvwrapper的配置详解
2020/07/01 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
公司门卫的岗位职责
2014/02/19 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
安全教育月活动总结
2014/05/05 职场文书
小学生迎国庆演讲稿
2014/09/05 职场文书
单位婚育证明范本
2014/11/21 职场文书
公司副总经理岗位职责
2015/04/08 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书
导游词之崇武古城
2019/10/07 职场文书
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers