在学习中摸索简单的ORM和模板层html的数据交互中的增删改查功能。
主要和网络教程不同的是我查询用的是fileter去对象,再在html中用for in给对象实例化,再获取对应属性的值,而b站的教程用的是get获取单条数据,能直接.属性取值,两种方法都是能实现效果的,但需要注意用get的方法更新数据最后要用save方法保存,用filter的update就不用save了。
下面开始举例子:
先看html页面:
urls层
from django.contrib import admin
from django.urls import path, re_path,include
from . import views
urlpatterns = [
# 查数据
path('page/01', views.view01),
# 改数据
path('page/01/<int:page>', views.view02),
path('page/01/update_news/<int:page>', views.view02),
# 删数据
path('page/02/<int:page>', views.view03),
# 加数据
path('page/03/<int:page>', views.view04),
path('page/03/add/<int:page>', views.view04),
]
访问主页的views方法:
def view01(request):
all = models.news_inr_test.objects.all()
return render(request, 'news/news.html', locals())
主页的模板html:
只截取表格部分(调用view方法的值的部分):
<table border="1">
<tr>
<th>id</th>
<th>name</th>
<th>time</th>
<th>price</th>
</tr>
{% for i in all %}
<tr>
<td>{{ i.id }}</td>
<td>{{ i.title }}</td>
<td>{{ i.time }}</td>
<td>{{ i.price}}</td>
<td>
<a href="01/{{ i.id }}">修改</a>
<a href="02/{{ i.id }}">删除</a>
<a href="03/{{ i.id }}">增加</a>
</td>
</tr>
{% endfor %}
</table>
需要注意 view01方法的查询是 all = models.news_inr_test.objects.all()
方法的是一个Queey对象 包含所有数据的对象 所以用for in 一个一个取出来
这里中 a标签中链接 和当前页面拼接了 能访问对应view02方法绑定的url地址
数据更新和数据增加操作:
因为这两个方法的步骤是类似的,注要是最后获取表格提交的数据进行不同的数据库方法。
以数据增加为案例:
urls中所用的链接:
# 加数据
path('page/03/<int:page>', views.view04),这一条是主页点击增加按钮跳转到表单的页面
path('page/03/add/<int:page>', views.view04),这一条是点击后,模板层表单页面的方法
views中的方法:
def view04(request,page):
son_page = models.news_inr_test.objects.filter(id=page)
all = models.news_inr_test.objects.all()
这里对 all这行补充一下,如果你直接重定向回主页,这里可以不加,但如果通过给新页面模板的画就要加油,不然的话主页没有all中数据库数据。
if request.method=='GET':
return render(request, 'news/add.html', locals())
elif request.method=='POST':
update_id = request.POST['id']
update_title = request.POST['title']
update_time=request.POST['time']
update_price=request.POST['price']
models.news_inr_test.objects.create(id=update_id,title=update_title,time=update_time,price=update_price)
return HttpResponseRedirect('/news/page/01')
add.html(模板层):
{% for son_page1 in son_page %}
<form action="add/{{ son_page1.id }}" method='POST'>
<p>id <input type="text" name="id" value=""></p>
<p>title <input type="text" name="title" value=""></p>
<p>time <input type="text" name='time' value=""></p>
<p>price <input type="text" name='price' value=""></p>
<input type="submit" value="更新">
</form>
{% endfor %}
操作过程和方法逻辑分析:
主页点击增加按钮,因为是GET请求,被view 中 if判定去add.html模板的页面,注意看这个html表单中aiton链接,绑定的也是view04方法,只不过因为是表格提交(POST),所以不用占用GET,只走post路线。
只有post表单中action产生post请求,响应view04中post方法,view中通过request.POST获取页面提交的数据,之后用对应ORM方法增加或者更新数据
增加数据:
models.news_inr_test.objects.create(id=update_id,title=update_title,time=update_time,price=update_price)
修改数据:
son_page.update(time=update_time)
son_page.update(price=update_price)
顺便贴一个删除数据的:
son_page.delete()
最后,通过重定向回主页(最方便):
return HttpResponseRedirect('/news/page/01')
删除数据操作就不单独写了,我的方法也是用filter通过页面给的page当id,绑定后生成对象,再直接.delete()删除就行了。
补充一下get和filter的查询内容:
补充说明:这些图用的是一位博主的学习记录,十分感谢他的记录。