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实现爬虫下载漫画示例
Feb 16 Python
Python写的Tkinter程序屏幕居中方法
Mar 10 Python
python删除某个字符
Mar 19 Python
快速解决PyCharm无法引用matplotlib的问题
May 24 Python
python实现AES加密解密
Mar 28 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
Python reversed函数及使用方法解析
Mar 17 Python
python+adb命令实现自动刷视频脚本案例
Apr 23 Python
keras自定义回调函数查看训练的loss和accuracy方式
May 23 Python
keras读取h5文件load_weights、load代码操作
Jun 12 Python
Python实现EM算法实例代码
Oct 04 Python
Python爬虫中urllib3与urllib的区别是什么
Jul 21 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/10/09 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
Yii框架中jquery表单验证插件用法示例
2016/10/18 PHP
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
在ASP.NET中使用JavaScript脚本的方法
2013/11/12 Javascript
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
JSON取值前判断
2014/12/23 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
2016/05/17 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
2016/10/14 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
python 调用c语言函数的方法
2017/09/29 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
2017/11/08 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
python中列表的切片与修改知识点总结
2019/07/23 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
python如何修改文件时间属性
2021/02/05 Python
HTML5+JS实现俄罗斯方块原理及具体步骤
2013/11/29 HTML / CSS
台湾母婴用品购物网站:Infant婴之房
2018/06/15 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
学生发电厂实习自我鉴定
2013/09/22 职场文书
八一慰问活动方案
2014/02/07 职场文书
诉前财产保全担保书
2014/05/20 职场文书
群教个人对照检查材料
2014/08/20 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
活动总结模板大全
2015/05/11 职场文书
雷锋观后感
2015/06/10 职场文书
七个Python必备的GUI库
2021/04/27 Python
go goroutine 怎样进行错误处理
2021/07/16 Golang
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis
使用Python开发贪吃蛇游戏 SnakeGame
2022/04/30 Python