视图2 render渲染数据
通过分路由访问成功不同视图后,客户端在视图中操作数据:
客户端访问:
http://127.0.0.1:8000/myapp/index/
1、客户端进入主路由:
主路由配置(myweb项目下urls.py):
from django.conf.urls import include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hello/', hello),
url(r'^myapp/', include('myapp.urls')) # 主路由进入myapp分路由
]
在主路由中通过include(‘myapp.urls’)的方式包含分路由,使客户端访问进入分路由;
此时还需要配置myweb项目文件下的setting.py文件,在TEMPLATES中,修改内容:
‘DIRS’: [os.path.join(BASE_DIR,‘templates’)],
然后,在myweb项目文件中新建文件templates,再在templates文件中新建文件myapp
最好在myapp文件中创建index.html文件,来与客户端访问路径http://127.0.0.1:8000/myapp/index/对应。
2、分路由
分路由配置:
先在myapp文件中创建的urls.py
urls.py内容如下:
from django.conf.urls import url
from .views import * # 引入视图
# myapp路由
urlpatterns = [
url(r'^index/', index),
]
from .views import * # 引入视图
并在分路由中返回对应视图
3、视图渲染值
视图配置(myapp文件下的views.py)
views.py内容如下:
from django.shortcuts import render
from .models import *
# Create your views here.
def index(request):
book = Books.objects.all() # Queryset -- 伪数组 - 列表使用 -获取Books数据表中所有数据
# 将获取的数据render渲染到index.html,并return返回渲染后的index.html.
return render(request, 'myapp/index.html', {'book': book}) # 向render传递三个值(request,文件url,渲染值)
渲染的index.html文件有特定的接收数据格式:
{{ 输出值,可以是变量,也可以是对象.属性 }}
{% 执行代码段 %}
index.html内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
<table width="300px">
<tr>
<td>ID</td><td>编号</td><td>书名</td><td>价格</td><td>生产日期</td><td>操作</td>
</tr>
{% for val in book%}
<tr>
<td>{{val.id}}</td>
<td>{{val.bid}}</td>
<td>{{val.bname}}</td>
<td>{{val.bprice}}</td>
<td>{{val.cpub_time}}</td>
<td>删除</td>
</tr>
{% endfor%}
</table>
</body>
</html>
浏览器访问index.html结果:
客户端操作渲染的数据
通过a标签访问不同操作来实现
在开始实现前先修改一下index视图渲染数据的查询方式
修改myapp文件中的views.py:
将原来的:
def index(request):
book = Books.objects.all() # Queryset -- 伪数组 - 列表使用 -获取Books数据表中所有数据
# 将获取的数据render渲染到index.html,并return返回渲染后的index.html.
return render(request, 'myapp/index.html', {'book': book}) # 向render传递三个值(request,文件url,渲染值)
修改为:
def index(request):
book = Books.objects.filter(is_delete=0)
return render(request, 'myapp/index.html', {'book': book}) # render传递三个值(request,文件url,渲染值)
将原来的无条件查询所有,改为过滤器条件查询。
注:修改引用models.py中的类,将class Books(models.Model):中继承models.Model,修改为继承自定义类,以自动添加过滤器中用于过滤的is_delete属性。# TODO 5555555555 I said it’s too late
配置index.html文件
修改index.html文件中的
<td>删除</td>
为:
<td><a href="/myapp/delete/{{val.id}}">删除</a></td>
此时点击删除将访问/myapp/delete,并返回要删除的数据对应的id值;
由于主路由的配置,我们只需在myapp中定义对应的delete操作:
配置myapp分路由(myapp下的urls.py)
修改urls.py内容如下:
from django.conf.urls import url
from .views import * # 引入视图
# myapp路由
urlpatterns = [
url(r'^index/', index),
url(r'^delete/(\d+)', delete),
]
url配置完成后继续配置其对应的操作(delete):
在myapp文件的views.py中添加内容:
def delete(request, bid):
# 接收客户端request及删除数据的id
book = Books.objects.get(id=bid) # 查询该id
book.is_delete = 1 # 修改过滤属性(0为显示,1为不显示--软删除)
book.save() # 保存修改
return HttpResponseRedirect('/myapp/index') # a标签访问完/myapp/delete/id后不用真的跳转到该页,继续返回/myapp/index
此即完成!
再次访问:http://127.0.0.1:8000/myapp/index/
点击删除按钮,删除《哈姆雷特》成功: