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的判断语句模拟三目运算
Apr 24 Python
基于Python中单例模式的几种实现方式及优化详解
Jan 09 Python
Python实现的FTP通信客户端与服务器端功能示例
Mar 28 Python
numpy实现合并多维矩阵、list的扩展方法
May 08 Python
python3实现带多张图片、附件的邮件发送
Aug 10 Python
Numpy的简单用法小结
Aug 28 Python
python绘制规则网络图形实例
Dec 09 Python
基于python实现地址和经纬度转换
May 19 Python
如何使用Django Admin管理后台导入CSV
Nov 06 Python
Python制作简单的剪刀石头布游戏
Dec 10 Python
基于Python和openCV实现图像的全景拼接详细步骤
Oct 05 Python
python装饰器代码解析
Mar 23 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
无线电波是什么?它是怎样传输的?
2021/03/01 无线电
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
PHP 数组和字符串互相转换实现方法
2013/03/26 PHP
thinkphp缓存技术详解
2014/12/09 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
PHP使用递归按层级查找数据的方法
2019/11/10 PHP
JQuery的一些小应用收集
2010/03/27 Javascript
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
JavaScript网页定位详解
2014/01/13 Javascript
Node.js的包详细介绍
2015/01/14 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
2016/09/05 Javascript
jQuery实现拖拽可编辑模块功能代码
2017/01/12 Javascript
ES6中参数的默认值语法介绍
2017/05/03 Javascript
使用JS动态显示文本
2017/09/09 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
setTimeout与setInterval的区别浅析
2019/03/23 Javascript
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
Python爬取网页中的图片(搜狗图片)详解
2017/03/23 Python
用python实现学生管理系统
2020/07/24 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
Python利用myqr库创建自己的二维码
2020/11/24 Python
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
大学生职业生涯规划书模版
2013/12/30 职场文书
法律专业应届生自荐信范文
2014/01/06 职场文书
授权委托书怎么写
2014/04/03 职场文书
青年标兵事迹材料
2014/08/16 职场文书
在K8s上部署Redis集群的方法步骤
2021/04/27 Redis
css中z-index: 0和z-index: auto的区别
2021/08/23 HTML / CSS