[Django]《Python Web开发 测试驱动方法》前六章非测试部分总结
来源:互联网 发布:javascript选项卡切换 编辑:程序博客网 时间:2024/06/05 10:10
摘要:《Python Web开发 测试驱动方法》第一部分(前六章)的非测试部分的工作总结。
Web应用目标:一个待办事项清单。数据库模型为一个列表对应多个待办事项。
根据URL-视图-模板的工作原理,对这些文件按顺序做一个总结。
(1)首先是项目的urls.py文件(路径:superlists/superlists/urls.py)
urlpatterns = [ url(r'^admin/', include(admin.site.urls)), url(r'^lists/',include('lists.urls',namespace="lists")) ,]总结:将以'lists/'开头的URL指向应用中的urls.py,命名空间为应用名'lists'
(2)模型models.py文件(路径:superlists/lists/models.py)
from django.db import modelsclass List(models.Model): passclass Item(models.Model): text = models.TextField() list = models.ForeignKey(List,default=None)
(3)应用中的urls.py文件(路径:superlists/lists/urls.py)
from . import viewsurlpatterns = [ url(r'^$',views.home_page,name="home_page"), url(r'^new$',views.new_list,name="new_list"), url(r'^(\d+)/$',views.view_list,name="view_list"), url(r'^(\d+)/add_item$',views.add_item,name="add_item"), ]
(4)视图views.py文件(路径:superlists/lists/views.py)
from django.shortcuts import render,redirectfrom django.http import HttpResponsefrom .models import Item,List# Create your views here.def home_page(request): return render(request,'lists/home_page.html') def new_list(request): list_ = List.objects.create() Item.objects.create(text=request.POST['item_text'],list=list_) return redirect('/lists/%d/'%(list_.id)) def view_list(request,list_id): list_ = List.objects.get(id=list_id) return render(request,'lists/view_list.html',{'list':list_}) def add_item(request,list_id): list_ = List.objects.get(id=list_id) Item.objects.create(text=request.POST['item_text'],list=list_) return redirect('/lists/%d/'%(list_.id))(5)模板文件
①home_page.html(路径:suprelists/lists/templates/lists/home_page.html)
<html> <title>To-Do list</title> <body> <h1>Start a To-Do list</h1> <form method="POST" action="/lists/new"> <input name="item_text" id="id_new_item" placeholder="Enter a to-do item"/> {% csrf_token %} </form> </body></html>②view_list.html(路径:suprelists/lists/templates/lists/view_list.html)
<html> <title>Your To-Do list</title><body> <h1>Your To-Do list</h1> <form method="POST" action="/lists/{{ list.id }}/add_item"> <input name="item_text" id="id_new_item" placeholder="Enter a to-do item"/> {% csrf_token %} </form> <table id="id_list_table"> {% for each_item in list.item_set.all %} <tr><td>{{ forloop.counter }} : {{ each_item.text }}</td></tr> {% endfor %} </table></body></html>
首先,URL'http://localhost:8000/lists/'匹配成功后,连接到视图views.home_page(),视图渲染模板home_page.html,在浏览器中打开home_page.html。
此时,在home_page页面的表单中输入数据并回车,注意home_page.html的表单中:
<form method="POST" action="lists/new"><input name="item_text"....表单带着名为"item_text"的数据,通过POST方式,匹配URL "lists/new",在urls.py文件处,有:
url(r'^new$',views.new_list,name="new_list"),于是带着"item_text"访问views.new_lists()视图:
def new_list(request): list_ = List.objects.create() Item.objects.create(text=request.POST['item_text'],list=list_) return redirect('/lists/%d/'%(list_.id))new_list()函数执行,在数据库中新建了一个列表list_,然后新建一个Item,text属性为表单带来的'item_text',list属性为list_。然后通过redirect()函数转到URL ’lists/%d',%d是当前列表list_的id。这个URL在urls.py中匹配的情况是:
url(r'^(\d+)/$',views.view_list,name="view_list"),连接到视图views.view_list(request,list_id),其中list_id是正则表达式中的(\d+),正则表达式中的每一个“捕获组”,也就是括号中的内容,会成为参数按顺序传递给视图函数。
def view_list(request,list_id): list_ = List.objects.get(id=list_id) return render(request,'lists/view_list.html',{'list':list_})
view_list()视图的作用是通过list_id找到需要展示的列表list_,然后渲染模板view_list.html,在浏览器中打开渲染后的模板。
<html> <title>Your To-Do list</title><body> <h1>Your To-Do list</h1> <form method="POST" action="/lists/{{ list.id }}/add_item"> <input name="item_text" id="id_new_item" placeholder="Enter a to-do item"/> {% csrf_token %} </form> <table id="id_list_table"> {% for each_item in list.item_set.all %} <tr><td>{{ forloop.counter }} : {{ each_item.text }}</td></tr> {% endfor %} </table></body></html>
view_list.html由两部分组成,<table>部分迭代list中的每个item元素,并按循环计数展示。
</form><table id="id_list_table">{% for each_item in list.item_set.all %}<tr><td>{{ forloop.counter }} : {{ each_item.text }}</td></tr>{% endfor %}</table>表单部分和home_page.html类似:
<form method="POST" action="/lists/{{ list.id }}/add_item"><input name="item_text"...
在表单中输入信息后回车,表单带着名为"item_text"的数据,通过POST方式,匹配URL "/lists/{{ list.id }}/add_item",在urls.py文件处,有:
url(r'^(\d+)/add_item$',views.add_item,name="add_item"),同上,匹配到视图函数add_item():
def add_item(request,list_id): list_ = List.objects.get(id=list_id) Item.objects.create(text=request.POST['item_text'],list=list_) return redirect('/lists/%d/'%(list_.id))add_item()接受参数list_id,打开id为list_id的列表list_,并在创建一个text属性为POST['item_text'],list属性为list_的Item。并通过redirect()转到URL '/lists/%d/'%(list_.id)。这一步和上面类似,将回到view_list()视图并打开view_list.html。
后记;
个人感觉,如果时间不是很充足,而且想直接学习Django而不是边学测试边学Django的话,换一本书学Django吧。这本书测试才是重头戏,很容易在不停增加的测试中,把自己对Django做过什么修改都忘了。要不是按作者的建议去看了官方文档然后回来总结,都不知道前六章居然只是做了这么些东西。
阅读全文
1 0
- [Django]《Python Web开发 测试驱动方法》前六章非测试部分总结
- Python Web开发:测试驱动方法pdf
- python web 驱动测试开发
- 【学习日志】关于Python web开发测试驱动方法
- python测试驱动开发
- python web开发框架django安装和测试
- web测试方法总结
- Web测试方法总结
- web测试方法总结
- web测试方法总结
- web测试方法总结
- web测试方法总结
- web测试方法总结
- web测试方法总结
- web测试方法总结
- web测试方法总结
- web测试方法总结
- web测试方法总结
- Struts2深入理解
- Android -- 自定义View小Demo,绘制四位数随机码
- LINUX使用记录
- lintcode最大子数组
- C++ 虚函数表解析
- [Django]《Python Web开发 测试驱动方法》前六章非测试部分总结
- 经典文章(Deep Convolutional Network Cascade for Facial Point Detection)一文的实现
- DMX512 数字灯光系统(DMX512-A)
- 自定义view
- 数据库调优
- socket(多线程)
- 初识JavaScript02--网页换肤
- html和css实现 字体变色 旋转 图标渐变
- SDUT 3379 数据结构实验之查找七:线性之哈希表(线性探测法解决冲突)