好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Django框架学习Forms篇

Django框架学习Forms篇

Forms

HTML form是交互网页的支柱。下面来学习一下有关使用Django处理用户提交的表单数据,验证等功能。

我们将讨论HttpRequest和Form对象。

request中包含的信息

在views.py中的每一个用于显示页面的函数都需要以request作为第一个函数参数。request包含了一些有用

的信息,如:

request.path               除去了域名和端口的访问路径,

request.get_host       域名+端口信息

request.get_full_path()   所有路径,包含传递的参数

requets.is_secure()     是否使用https进行链接

还有一个特别的属性request.META,它是一个dict类型,包含了所有HTTP header信息,不过也要根据用户

的实际环境来决定。如

HTTP_REFERER

HTTP_USER_AGENT   用户使用的浏览器信息

REMOTE_ADDR     用户的IP,如果使用代理,也可以显示出来

(有很多属性,只是截图了一些)

  

并不是每一个用户提交的头信息都相同,所以在读取的时候,要考虑一些异常情况,比如取不到相应的值的情况。

可以使用try...except,也可以使用dict.get(key, default)中默认返回为预设值的方法。

def ua_display_good1(request):

    try:

        ua = request.META['HTTP_USER_AGENT']

    except KeyError:

        ua = 'unknown'

    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)

 

除了以上的这些元数据的信息,HttpRequest对象还包括两个属性包括了用户提交的数据:

request.GET和request.POST。它们都是dictionary-like对象。意思就是说可以像dict那样

操作,但不是dict,还有一些dict没有的操作。

 

下面构造一个用于用户搜索的简单form例子。

#template/search_form.html

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

#template/search_results.html

< p >Your searched for '{{ query }}'
{% if books %}
    {% for book in books %}
        < li >{{ book. title  }}</ li >
    {% endfor %}
{% else %}
    < p >No books found.
{% endif %}

# urls.py
from  django.conf.urls  import  patterns, include, url
from  books.views  import  hello, search_form,  search
urlpatterns  =  patterns( '' ,
    url(r '^search-form/$' , search_form),
    url(r '^search/$' ,  search ),                     
)
#views.py
from  django.http  import  HttpResponse
from  django.shortcuts  import  render_to_response
from  books.models  import  Book

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

def   search (request) :
     if   'q'   in  request.GET : #GET是一个dict,使用文本框的name作为key
     #在这里需要做一个判断,是否存在提交数据,以免报错
        q  =  request.GET[ 'q' ]
         #使用lookup后缀,意思为书名不区分大小写,包含q就可以
        books  =  Book.objects. filter (title__icontains = q)
         return  render_to_response( 'search_results.html' , { 'books' :  books,  'query' : q})
     else :
        message  =   'You submitted an empty form.'
         #只是简单的返回一个response对象,因为没有使用模块,所以也不用渲染数据Context
         return  HttpResponse(message)

 

还有一点,form中的action属性如果为空的,代表提交数据到当前页面。    

 

关于表单验证

可以在server端进行,有时会加重server负担,也可以使用Javascript在client端进行。有一点需要注意的是,

即使你使用了javascript在client进行了验证,还是需要在server端对用户提交的数据进行审查,比如有些人

会在浏览器中禁用javascript,也有些人会来搞注入攻击。总之,不能相信用户提交的提交,进行防御性编码。

 

关于使用重定向

你应当总是在一个成功处理POST请求之后进行redirect,这样可以避免用户多次点击提交按钮带来的二次请求

问题,有时会造成不好的后果,如向数据库插入重复记录等。

from django.http import HttpResponseRedirect

return HttpResponseRedirect('/success/')

使用Django的form system来简化表单工作

在app文件夹下创建forms.py,其实在哪里创建都可以:

from django import forms

 

class ContactForm(forms.Form):

    subject = forms.CharField()

    email = forms.EmailField(required=False)

    message = forms.CharField()

form的定义和model类的定义很像。我们可以使用python manage.py shell来查看form类的信息。

 

可以看到打印出来的f的信息其实是网页格式的。

也可以改变默认表格的格式。

 

这里的<table>,<ul>都没有包含在输出里,所以可以自由地添加行等。

除了打印出整个form的HTML内容,还可以打印出局的字段的内容。

 

 

还可以使用form类进行验证,使用dict对form类进行初始化。

>>> f = ContactForm({'subject': 'Hello', 'email': 'adrian@example.com', 'message': 'Nice'})

>>> f.is_bound #是否绑定表单类

True

>>> f.is_valid() #数据内容是否合法

True

当数据全部合法时,可以使用clean_data这个属性,用来得到经过'clean'格式化的数据,会所提交过

来的数据转化成合适的Python的类型。

 

如何在view中使用form类

# views.py

from  django.shortcuts  import  render_to_response
from  mysite.contact.forms  import  ContactForm

def  contact(request) :

     #可以不写,因为python中if中定义的变量,也可以在整个函数中可见     

    form  =   None 
     if  request.method  ==   'POST' :
        form  =  ContactForm(request.POST)
         if  form.is_valid() :
            cd  =  form.cleaned_data
            send_mail(
                cd[ 'subject' ],
                cd[ 'message' ],
                cd.get( 'email' ,  'noreply@example.com' ),
                [ 'siteowner@example.com' ],
            )
             return  HttpResponseRedirect( '/contact/thanks/' ) #需要在urls.py中配置路径
     else :
        form  =  ContactForm()
     return  render_to_response( 'contact_form.html' , { 'form' : form})

 

# contact_form.html

 

< html >
< head >
    < title >Contact us</ title >
</ head >
< body >
    < h1 >Contact us</ h1 >

    {% if  form .errors %}
        < p   style = "color: red;" >

            {# pulralize 是filter,用来判断是否为添加's'来表示单词的复数形式#}
            Please correct the error{{  form .errors|pluralize }} below.
        </ p >
    {% endif %}

    < form   action = ""   method = "post" >
        < table >
            {# 可以使用as_ul, as_p来改变格式 #}
            {{  form .as_table }}
        </ table >
        < input   type = "submit"   value = "Submit" >
    </ form >
</ body >
</ html >

 

在构造form的时候,还可以改变字段的构造参数

class  ContactForm(forms.Form) :
    subject  =  forms.CharField(max_length = 100 )
    email  =  forms.EmailField(required = False )
    message  =  forms.CharField(widget = forms.Textarea)

还可以给form类添加默认值

form = ContactForm(

            initial={'subject': 'I love your site!'}

        )

 

给form类自定义验证规则,如果想要重用验证机制,可以单独创建新的字段类,重新写它的验证方法。

一般的可以直接在form类加入clean_字段名的方法,Django会自动查找以clean_开头的函数名,并会在

验证该字段的时候,运行这个函数。

from  django  import  forms

class  ContactForm(forms.Form) :
    subject  =  forms.CharField(max_length = 100 )
    email  =  forms.EmailField(required = False )
    message  =  forms.CharField(widget = forms.Textarea)

     def  clean_message( self ) :
        message  =   self .cleaned_data[ 'message' ]
        num_words  =   len (message.split())
         if  num_words  <   4 :
             raise  forms.ValidationError( "Not enough words!" )
         return  message

在自定义的验证函数中,我们必须显示的返回字段名的内容,否则会带来表单数据丢失。

 

可以改变字段的label显示的名称

email = forms.EmailField(required=False, label='Your e-mail address')

 



通过 为知笔记 发布


(5)Django框架学习-Forms篇

摘要: FormsHTML form是交互网页的支柱。下面来学习一下有关使用Django处理用户提交的表单数据,验证等功能。我们将讨论HttpRequest和Form对象。request中包含的信息在views.py中的每一个用于显示页面的函数都需要以request作为第一个函数参数。request包含了一些有用的信息,如:request.path 除去了域名和端口的访问路径,request.get_host 域名+端口信息request.get_full_path() 所有路径,包含传递的参数requets.is_secure() 是否使用https进行链接还有一个特别的属性request.META 阅读全文

posted @  2012-08-27 15:06  btchenguang 阅读(182) |  评论 (0) 编辑

 

(4)Django框架学习-Admin篇

摘要: Admin后台管理模块的使用Django的管理员模块是Django的标准库django.contrib的一部分。这个包还包括其它一些实用的模块:django.contrib.authdjango.contrib.sessionsdjango.contrib.comments激活admin模块的方法是:1. 在INSTALLED_APPS设置文件中,加入'django.contrib.admin'2... 阅读全文

posted @  2012-08-25 14:23  btchenguang 阅读(18) |  评论 (0)   编辑

 

(3)Django框架学习-Model篇

摘要: Model使用简单的,先展示在view中使用mysql数据库操作from django.shortcuts import render_to_responseimport MySQLdbdef book_list(request):db = MySQLdb.connect(user='me', db='mydb', passwd='secret', host='localhost')cursor = db.cursor()cursor.execute('SELECT name FROM books ORDER BY nam 阅读全文

posted @  2012-08-25 14:22  btchenguang 阅读(831) |  评论 (0) 编辑

 

(2)Django框架学习--模板篇

摘要: 模板使用模板基本由两个部分组成,一是HTML代码,二是逻辑控制代码。逻辑控制的实现又基本由三个部分组成:1. 变量的使用{{ person_name }} #使用双大括号来引用变量2. tag的使用{% if ordered_warranty %} #使用大括号和百分号的组成来表示使用Django提供的template tag{% for item in item_list %}<li>{{ it... 阅读全文

posted @  2012-08-25 14:22  btchenguang 阅读(14) |  评论 (0)   编辑

 

(1)Django框架学习-开篇

摘要: 初识Django自称MTV框架。和传统的MVC大同小异。M指数据模型(Model),T指模板(Template),用来描述数据的展现。V指的是视图(View),并且,在Django中可以通过URL分发器对URL和View之间的映射进行配置,而View则URL分发器回调。Django发布在2005年7月,为了纪念法国爵士吉它手Django Reinhardt快速体验首先,官网下载,安装,使用命令py... 阅读全文

posted @  2012-08-25 14:21  btchenguang 阅读(38) |  评论 (0)   编辑

 

Median Maintainence—中间值查找问题

摘要: 问题描述: 随机给出一串数i, 要能够给出其中大小中间的那个数 算法描述: 一般做法,做插入排序,然后中间值在索引一半的位置,时间复杂度一般,插入排序平均时间复杂度O(n2),再找中间 值,效率不高。 这里的做法是,引入数据结构--Heap来解决问题,时间复杂度为O(logn)。 引入两个堆,max heap和 min heap来存放整数串i的两个部分,需要满足如下条... 阅读全文

posted @  2012-05-06 10:31  btchenguang 阅读(43) |  评论 (0)   编辑

 

强连通Kosaraju算法--不知道哪里错了?请教高手~~

摘要: 有问题,调试了很久也没有发现错在哪里。。。高手们,请指教源码附件:https://files.cnblogs.com/btchenguang/scc.zip概念:有向图中的强连通指的是可以相互访问到的顶点的集合,简而言之是组成环的顶点的集合,在一个有向图中可能有很多个不同的强连通部分算法思想:1. Let G be a directed graph and S be an empty stack.2. While S does not contain all vertices Choose an arbitrary vertex v not in S. Perform a depth-first 阅读全文

posted @  2012-04-26 16:05  btchenguang 阅读(58) |  评论 (0)   编辑

 

关于Python Profilers性能分析器

摘要: 想了解一下python的性能调试方法,结果就看到这一篇文章,想翻译下来作个记录 原文来自于:http://docs.python.org/library/profile.html?highlight=profile#cProfile 1. 介绍性能分析器 profiler是一个程序,用来描述运行时的程序性能,并且从不同方面提供统计数据加以表述。Python中含有3个模块提供这样的功能,分别是... 阅读全文

posted @  2012-02-03 15:03  btchenguang 阅读(248) |  评论 (0) 编辑

 

python的二维数组操作

摘要: 需要在程序中使用二维数组,网上找到一种这样的用法: #创建一个宽度为3,高度为4的数组#[[0,0,0], # [0,0,0],# [0,0,0],# [0,0,0]]myList = [[0] * 3] * 4但是当操作myList[0][1] = 1时,发现整个第二列都被赋值,变成[[0,1,0], [0,1,0], [0,1,0], [0,1,0]] 为什么...一时搞不懂,后面翻阅The... 阅读全文

posted @  2012-01-30 22:38  btchenguang 阅读(1923) |  评论 (2) 编辑

 

0/1背包问题--Dynamic Programming

摘要: DP问题的特征:重复子问题存在最优子集背包问题属于经典的DP问题,而0/1背包问题是属于最简单的情况。0/1的意思是每种物品只有一件,要么放入背包中,要么不放问题定义:有N个物品,要放入容量为W的背包中,第i件物品重量为w(i),价值为v(i),问要怎样放才能在不超过背包容量的基础上,获得最大的价值。算法描述:需要用到递归的思想,定义A(i, j)为前i个物品中在容量为j的情况下所能达到的最大价值,则A(0,j) = 0,A(i,0) = 0(i <= N and j <= W).如果w(i) > j时,说明第i件物品不能放入背包中,价值不变,所以A(i, j) = A(i  阅读全文

posted @  2012-01-18 14:40  btchenguang 阅读(87) |  评论 (0)   编辑

 

配置在python shell中执行自定义函数

摘要: 1. 需要把example.py文件所在的文件夹路径添加到系统path环境变量中2. 在调用的时候>>>import example>>>example.function()python编译器首先是在当前路径(python.exe所在文件夹)下寻找文件,然后再去path定义的路径中寻找文件 阅读全文

posted @  2012-01-18 13:58  btchenguang 阅读(135) |  评论 (0) 编辑

作者: btchenguang

出处: http://www.cnblogs.com/btchenguang/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

分类:  python ,  framework ,  django

标签:  django ,  framework ,  python

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于Django框架学习Forms篇的详细内容...

  阅读:243次