[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做过什么修改都忘了。要不是按作者的建议去看了官方文档然后回来总结,都不知道前六章居然只是做了这么些东西。