码迷,mamicode.com
首页 > 其他好文 > 详细

Django学习笔记5--表单

时间:2015-02-02 17:26:42      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

Django 对用户通过表单提交的数据进行访问,有效性检查,以及其他处理.

1.从requset对象中获得数据

每个view函数的第一个参数是HttpResquest对象

def hello(request):
    return HttpResponse("Hello world")

如上, 变量request 就是一个HttpRequest 对象, 会它有自己的属性方法,在view 函数执行过程中,可以用这些属性来获取当前request的一些信息,比如加载这个页面的是是谁,或者用的是什么浏览器

 

URL相关信息

属性/方法                             说明                                                      举例

request.path                        除域名以外的请求路径,以正斜杠开头    "/hello/"

request.get_host()              主机名(比如,通常所说的域名)               "127.0.0.1:8000"   or  " www.example.com"

request.get_full_path()       请求路径,可能包含查询字符串            "/hello/?print=true"

request.is_secure()            如果通过HTTPS访问,则此方法返回True, 否则返回False                True 或者 False

 

2.有关request的其它信息
request.META 是一个Python字典,包含了所有本次HTTP请求的Header信息,比如用户IP地址和用户Agent
(通常是浏览器的名称和版本号)。 注意,Header信息的完整列表取决于用户所发送的Header信息和服务器
端设置的Header信息。 这个字典中几个常见的键值有:

  • HTTP_REFERER ,进站前链接网页,如果有的话。 (请注意,它是 REFERRER 的笔误。)
  • HTTP_USER_AGENT ,用户浏览器的user-agent字符串,如果有的话。 例如:
    "Mozilla/5.0 (X11; U; Linux i686; fr‐FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17" .

  • REMOTE_ADDR 客户端IP,如: "12.345.67.89" 。(如果申请是经过代理服务器的话,那么它可能是以逗号分
    割的多个IP地址,如: "12.345.67.89,23.456.78.90" 。)

注意,因为 request.META 是一个普通的Python字典,因此当你试图访问一个不存在的键时,会触发一个
KeyError异常。 (HTTP header信息是由用户的浏览器所提交的、不应该给予信任的“额外”数据,因此你总
是应该好好设计你的应用以便当一个特定的Header数据不存在时,给出一个优雅的回应。)你应该用
try/except 语句,或者用Python字典的 get() 方法来处理这些“可能不存在的键”:

def ua_display_good1(request):
    try:
        ua=request.META["HTTP_USER_AGENT"]
    except KeyError:
        ua=unknow
    return HttpResponse("Your browser is %s" %ua)

def ua_display_good2(request):
    ua=request.META.get(HTTP_USER_AGENT,unknown)
    return HttpResponse("Your browser is %s" %ua)

可以写一个函数来显示request.MEAT的所有数据,这样你就知道里面有什么了,

def display_meta(request):
    values = request.META.items()
    values.sort()
    html=[]
    for k,v,in values:
        html.append(<tr><td>%s</td><td>%s</td></tr>%(k,v)+"\n")
    return HttpResponse(<tables>%s</tables>%\n.join((html)))

3.提交的数据信息

除了基本的元数据,HttpRequest对象还有两个属性包含了用户所提交的信息: request.GET 和 request.POST 二者都是类字典对象,你可以通过它们来访问GET和POST数据.

类字典对象: requeset.GET request.POST是类字典对象,他们的行为像Python里标准字典对象,但是在技术底层不是标准字典, 虽然他们都有get(),keys() 和 values()方法,你可以用for key in request.GET 获取所有的键,但是他们还有一些普通字典没有的方法.

Post数据是来自html的<fom>标签提交的,而get数据可能来自<from>提交也可能是url中的查询字符串

表单开发分为两部分,前端html页面用户接口和后台view函数对所提交的数据的处理过程

 ----一个表单处理示例

首先在view建立一个显示一个搜索表单:

def search_form(request):
    return render_to_response(search_form.html)

serch_form.html 

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

</body>
</html>

然后在url匹配,还有一点,就是在引用这个Temlate的时候,总是会显示TemplateDoesNotExist错误.原因是没有把html文件的目录放在settings 中,

可以在settings中添加

TEMPLATE_DIRS = (os.path.join(BASE_DIR, ‘templates‘).replace(‘\\‘,‘/‘),)

然后模板的目录就是,把html文件放在template文件中即可

.然后写action中 "/search/" 的views实现:

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

那数据是如何在这个系统中传递的呢?

  1. 首先我们在html中定义了一个q,当提交表单的时候,变量q的值通过GET(metho="get") 附加在URL/search/上
  2. 处理/search/的视图,通过request.GET 来获取q的值
  3. 需要注意的是这里需要判断q是否在GET中,对于用户提交过来的数据要进行过滤,和检查,否则会有异常,如这可能会有keyError
  4. 我还想知道GET传递了什么内容

 

Django学习笔记5--表单

标签:

原文地址:http://www.cnblogs.com/zzblee/p/4267987.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!