python web 测试驱动方法 非测试部分总结

  一个多星期终于读完了python web测试驱动方法的第一部分,按照书上也将该敲的代码敲了一边,这里总结一下待办事项网站开发的非测试部分。

<superlists/urls.py>

fromdjango.contrib import admin
from django.urls import path,include,re_path
fromlists import views
from django.conf.urls import url
import lists
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^$', views.home_page, name='home'),#定义首页的url
url(r'^lists/',include('lists.urls')),#引入<lists/urls.py>的内容
]
<lists/urls.py>

fromdjango.conf.urls import url
from lists import views
urlpatterns = [
url(r'^new$',views.new_list,name="new_list"), #定义新建列表url
url(r'^(\d+)/$',views.view_list,name="view_list"), #定义视图列表url,让每一个列表都有一个url
url(r'^(\d+)/add_item$',views.add_item,name="add_item"),#在同一个列表中增加新的Item
]

在写上面的内容时,因为我用的是Dango2.0版本,当我尝试使用path来替代url,在新建add_item的内容后,ASsertionError0=1的错误一直无法消除,用回url后就不出现这个错误了,不知道是什么原因,有知道的希望分享一下。其次,path中使用正则表达式时使用的是re_path。

<lists/models.py>
from django.db import models
#和数据库里表相对应,一个表对应一个model类,表里的字段(列)对应类中属性,行对应类对象
class List(models.Model):
    pass
class Item(models.Model):
    text = models.TextField(default = '')#定义test为TextField,默认为''
    list = models.ForeignKey(List,default = None, on_delete=models.CASCADE)#通过外键ForeignKey使list与List相连

Django2.0中外键相连时没有on_delete属性会报错

<lists/views.py>
from django.shortcuts import render,redirect
from django.http import HttpResponse
from lists.models import Item,List

#views.py中的每一个函数都对应urls.py中的一个url
def home_page(request):#主界面
	return render(request,'home.html')#返回home.html界面


def view_list(request,list_id):#视图函数,显示界面
	list_ = List.objects.get(id = list_id)#在数据库中获取一个id为list_id的List列表
	#items = Item.objects.filter(list = list_)#返回数据库里的多个对象
	return render(request,'list.html',{'list':list_})#返回list.html界面,并向里传入数据库中的list数据


def new_list(request):#新建一个List
	list_  = List.objects.create()#在数据库中创建一个List列表
	Item.objects.create(text = request.POST['item_text'],list = list_)#创建一个Item列表,并向里传入item_text参数,与list关联
        return redirect('/lists/%d/' % (list_.id))#重定向'lists/%d'的url


def  add_item(request,list_id):#在List中增加一个Item
	list_= List.objects.get(id = list_id)#在数据库中获取一个id为list_id的List列表
	Item.objects.create(text = request.POST['item_text'],list = list_)
	return redirect('/lists/%d/' % (list_.id))#重定向'lists/%d'的url
<home.html>
<html>
<head>
	<title>To-Do lists</title>
</head>
<body>
	<h1>Start a new To-Do lists</h1>
	<form method="POST" action ="/lists/new">#输入内容点击Entry后,通过action执行url'为lists/new'的方法
		<input name = "item_text" id = "id_new_item" placeholder="Enter a to-do item" />
		{% csrf_token %}
	</form>
</body>
</html>
<list.html>
<html>
<head>
	<title>To-Do lists</title>
</head>
<body>
	<h1>Your To-Do lists</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 item in list.item_set.all%}
		<tr><td>{{forloop.counter}}:{{ item.text}}</td></tr>#forloop.counter显示序号
		{% endfor %}
	</table>
</body>
</html>
工作过程:

首先,URL'http://localhost:8000/'匹配成功后,连接到视图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()视图:

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+),正则表达式中的每一个“捕获组”,也就是括号中的内容,会成为参数按顺序传递给视图函数。

view_list()视图的作用是通过list_id找到需要展示的列表list_,然后渲染模板view_list.html,在浏览器中打开渲染后的模板。

view_list.html由两部分组成,<table>部分迭代list中的每个item元素,并按循环计数展示。

表单部分和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():


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。  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值