好记性不如铅笔头

Django, web, 编程

Django自学笔记:forms

最近自学了下Django,这里笔记下学习记录。

CONTENTS

备注:

1 学习记录中的代码和资料参考自网络教程【 http://djangobook.py3k.cn/2.0/ 】和【 http://www.djangobook.com/en/2.0/ 】,版权归原作者所有。
2 小弟第一次接触到Django,本笔记可能有错误,还请各位路过的大牛们给予指点。
3 由于教程年代比较久远了,而且Django不同版本改动很大,这里作者的学习笔记是基于【 python2.7.8 + django1.6.5 】实现的。
4 由于时间关系,学习记录里有的地方记得比较乱,以后有时间再整理下吧。 

forms:

这里简单的笔记下如何使用form来get/post数据到django。

首先我们先看下Request的一些信息:

HttpRequest对象包含当前请求URL的一些信息,另外,request.META 是一个Python字典,包含了所有本次HTTP请求的Header信息,比如用户IP地址和用户Agent(通常是浏览器的名称和版本号)。 注意,Header信息的完整列表取决于用户所发送的Header信息和服务器端设置的Header信息。因为 request.META 是一个普通的Python字典,因此当你试图访问一个不存在的键时,会触发一个KeyError异常。 (HTTP header信息是由用户的浏览器所提交的、不应该给予信任的“额外”数据,因此你总是应该好好设计你的应用以便当一个特定的Header数据不存在时,给出一个优雅的回应。)你应该用 try/except 语句,或者用Python字典的 get() 方法来处理这些“可能不存在的键”:

这里我们写代码来查看一下,先在urls.py中新加入一个网址路由:

url(r'^showrequest/$', showrequest),

然后在MyViewControllers.py中新加入一个函数:

def showrequest(request):
	res = "<h1>Hello Request</h1>";
	res += "request.path:    %s<br>"%(request.path);
	res += "request.get_host():    %s<br>"%(request.get_host());
	res += "request.get_full_path():    %s<br>"%(request.get_full_path());
	res += "request.is_secure():    %s<br>"%(request.is_secure());
	res += "<br>";
	
	try:
		val = request.META['HTTP_USER_AGENT'];
	except KeyError:
		val = "unknown";
	res += "request.META['HTTP_USER_AGENT']:    %s<br>"%(val);
	try:
		val = request.META['REMOTE_ADDR'];
	except KeyError:
		val = "unknown";
	res += "request.META['REMOTE_ADDR']:    %s<br>"%(val);
	
	res += "request.META['REFERRER']:    %s<br>"%(request.META.get('REFERRER', 'unknown'));		
	res += "<br>";
			
	for k, v in request.META.items():
		res += "request.META['%s']:    %s<br>"%(k,v);
			
	return HttpResponse(res);

然后访问网址:http://127.0.0.1:8000/showrequest/,就可以得到如下结果,如图:

也可以参考这个网址:http://www.oschina.net/code/snippet_116018_12444

Get:

首先构造一个页面,用来提交GET数据,这里为了简单,我们把页面写成模板格式,直接渲染出来。我们首先新建一个模板search_form.html,内容如下:

<html>
<head>
    <title>Search</title>
</head>
<body>
    <form action="/search/" method="get">
        <input type="text" name="q">
        <input type="submit" value="Search">
    </form>
</body>
</html>

如下图所示:

然后我们修改下MyViewControllers.py,增加函数:

from django.shortcuts import render;

def search_form(request):
	return render(request, 'search_form.html');

修改urls.py,增加网址路由:

url(r'^search_form/$', search_form),

搞定之后我们就可以访问网址http://127.0.0.1:8000/search_form/,如下:

我们简单的分析下search_form.HTML代码,可以发现,当点击search按钮时,会提交GET信息到/search/页面,同时会提交Get信息”q=xxx”,这里我们实现下search页面。

首先在MyViewControllers.py中添加函数:

def search(request):
	if 'q' in request.GET:
		message = 'You searched for: %s' % request.GET['q'];
	else:
		message = 'You submitted an empty form.';
	return HttpResponse(message);

然后在urls.py中注册一下:

    url(r'^search/$', search),

我们随便输入一些字符,点击Search按钮,如下图:

为了测试下GET,我们也可以遍历下Get数据,修改MyViewControllers.py中的search函数如下:

def search(request):
	if 'q' in request.GET:
		message = 'You searched for: %s' % request.GET['q'];
	else:
		message = 'You submitted an empty form.';
	
	message += "<br>";
	for k,v in request.GET.items():
		message += "request.GET['%s']:    %s<br>"%(k,v);		
							
	return HttpResponse(message);

然后我们自定义一些Get数据,比如访问网址:http://127.0.0.1:8000/search/?q=11&&num=22&&str=aa&&bb=’cc’,会有如下输出:

POST:

同GET差不多,我们新建一个意见反馈页面来模拟一个POST请求。

首先我们新建一个html模板文件:contact_form.html,内容为:

<html>
<head>
    <title>Contact us</title>
</head>
<body>
    <h1>Contact us</h1>
    <form action="/contact/" method="post">
	    	{% csrf_token %}
        <p>Subject: <input type="text" name="subject"></p>
        <p>Your e-mail: <input type="text" name="email"></p>
        <p>Message: <textarea name="message" rows="10" cols="50"></textarea></p>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

注意里面有个{% csrf_token %},如下图所示:

然后我们增加代码来支持对它的访问,代码如下:

MyViewControllers.py 中增加渲染函数:

from django.template import RequestContext;
def contact_form(request):
	return render(request, 'contact_form.html',context_instance=RequestContext(request));

urls.py中增加路由函数:

url(r'^contact_form/$', contact_form),

然后我们就可以访问网址:http://127.0.0.1:8000/contact_form/,如下图:

根据contact_form.html 文件,当点击submit时,会POST数据到路径/contact/下,这里我们实现下这个网络响应:

MyViewControllers.py 中增加函数:

def contact(request):
	message = "";
	for k,v in request.POST.items():
		message += "request.POST['%s']:    %s<br>"%(k,v);

	return HttpResponse(message);

urls.py中增加路由函数:

url(r'^contact/$', contact);

然后我们就可以输入测试字符串,然后submit,如下图:

可以看到POST的数据已经取到了。但是这里我们刷新下页面,会出现:

根据WEB开发的最佳实践,应每次都给成功的POST请求做重定向,防止重复提交,因此这里我们简单的改下代码:

修改MyViewControllers.py 

from django.http import HttpResponseRedirect;
def contact(request):
		#do nth ,just redirect~~
		return HttpResponseRedirect('/thanks/');
 
def thanks(request):
		return HttpResponse("thanks for your message");

urls.py中增加路由函数:

url(r'^thanks/$', thanks),

再次刷新,会重定向到新的页面,如下图:

备注:

各种有意思的评注:

发表评论

1 + 3 =

此站点使用 Akismet 来减少垃圾评论。了解我们如何处理您的评论数据