zoukankan      html  css  js  c++  java
  • 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')
     



    摘要: 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)编辑
     
    摘要: 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) 编辑
     
    摘要: 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)编辑
     
    摘要: 模板使用模板基本由两个部分组成,一是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) 编辑
     
    摘要: 初识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) 编辑
     
    摘要: 问题描述: 随机给出一串数i, 要能够给出其中大小中间的那个数 算法描述: 一般做法,做插入排序,然后中间值在索引一半的位置,时间复杂度一般,插入排序平均时间复杂度O(n2),再找中间 值,效率不高。 这里的做法是,引入数据结构--Heap来解决问题,时间复杂度为O(logn)。 引入两个堆,max heap和 min heap来存放整数串i的两个部分,需要满足如下条...阅读全文
    posted @ 2012-05-06 10:31 btchenguang 阅读(43) | 评论 (0) 编辑
     
    摘要: 有问题,调试了很久也没有发现错在哪里。。。高手们,请指教源码附件: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的性能调试方法,结果就看到这一篇文章,想翻译下来作个记录 原文来自于:http://docs.python.org/library/profile.html?highlight=profile#cProfile 1. 介绍性能分析器 profiler是一个程序,用来描述运行时的程序性能,并且从不同方面提供统计数据加以表述。Python中含有3个模块提供这样的功能,分别是...阅读全文
    posted @ 2012-02-03 15:03 btchenguang 阅读(248) | 评论 (0)编辑
     
    摘要: 需要在程序中使用二维数组,网上找到一种这样的用法: #创建一个宽度为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)编辑
     
    摘要: 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) 编辑
     
    摘要: 1. 需要把example.py文件所在的文件夹路径添加到系统path环境变量中2. 在调用的时候>>>import example>>>example.function()python编译器首先是在当前路径(python.exe所在文件夹)下寻找文件,然后再去path定义的路径中寻找文件阅读全文
    posted @ 2012-01-18 13:58 btchenguang 阅读(135) | 评论 (0)编辑
    作者:btchenguang
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
    分类: pythonframeworkdjango
    标签: djangoframeworkpython
  • 相关阅读:
    DEDECMS里面DEDE函数解析
    dede数据库类使用方法 $dsql
    DEDE数据库语句 DEDESQL命令批量替换 SQL执行语句
    织梦DedeCms网站更换域名后文章图片路径批量修改
    DSP using MATLAB 示例 Example3.12
    DSP using MATLAB 示例 Example3.11
    DSP using MATLAB 示例 Example3.10
    DSP using MATLAB 示例Example3.9
    DSP using MATLAB 示例Example3.8
    DSP using MATLAB 示例Example3.7
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2658886.html
Copyright © 2011-2022 走看看