• django表单


    一、主要内容

      1、服务端获取HttpRequest信息
            1)url相关信息
            2)HttpRequest.META中包含的键值对
            3)HttpRequest中用户提交的信息
            4)HttpRequest.GET:来自于<form>标签提交,或url查询字符串
                      一般只是从服务端获取信息
                 HttpRequest.POST:来自于<form>标签提交
                      可能修改服务端信息
            5)action=““意味着表单将提交给与当前页面相同的URL
        2、多参数校验
            1)发邮件
            2)重定向:我们应每次都给成功的POST请求做重定向。 这就是web开发的最佳实践。
                  原因:post成功后,直接重定向,不会造成重复向同一个页面post数据(返回同一个页面时,但参数要求不同)。    
            3)forms类只有绑定了才有error信息:
                initial函数不绑定,构造函数传入数据才绑定
            4)forms类中使用"clean_字段名()"方法,自定义数据校验规则
            5)forms类结合css进行渲染

    二、基础代码

      1、主要结构

      

      2、urls.py

    from django.conf.urls import patterns, include, url
    
    from django.contrib import admin
    admin.autodiscover()
    
    urlpatterns = patterns('',
        (r'^contact_author/$', 'django_manage_app.views.contact_author'),
        (r'^thanks/$', 'django_manage_app.views.thanks'),
    )

      3、views.py

    #coding:utf8
    from django.http import HttpResponseRedirect
    from django.shortcuts import render_to_response
    from django_manage_app.forms import ContactForm
    
    def contact_author(request):
        if request.method == 'POST':#提交请求时才会访问这一段,首次访问页面时不会执行
            form = ContactForm(request.POST)
            if form.is_valid():#说明各个字段的输入值都符合要求
                cd = form.cleaned_data#只有各个字段都符合要求时才有对应的cleaned_data
                print form.clean_message()
                print cd['subject']
                print cd['email']
                print cd['message']
                return HttpResponseRedirect('/thanks/')
            else:#有部分字段不符合要求,会有error相关信息给加到form中去,需要覆盖掉
                print form
                print '数据不符合要求'
                print form['subject'].errors
                print form['email'].errors
                print form['message'].errors
        else:#首次访问该url时没有post任何表单
            form = ContactForm()#第一次生成的form里面内容的格式
            print form
            print form.is_valid()
    
        #“首次访问”和“提交的信息不符合要求”时被调用
        return render_to_response('contact_author.html', {'form': form})
    
    
    def thanks(request):
    
        return render_to_response('thanks.html')

      4、forms.py

    #coding:utf8
    from django import forms
    
    class ContactForm(forms.Form):
        subject = forms.CharField(max_length=10,label='主题')#设置最大长度为10
        email = forms.EmailField(required=False,label='Email')#非必要字段
        message = forms.CharField(widget=forms.Textarea,label='信息')#指定form中组件的类型
    
        #自定义校验规则,该方法在校验时被系统自动调用,次序在“字段约束”之后
        def clean_message(self):
            message = self.cleaned_data['message']#能到此处说明数据符合“字段约束”要求
            num_words = len(message.split())
            if num_words < 4:
                raise forms.ValidationError("单词个数低于4个!")
            return message

      5、thanks.html

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
    </head>
    <body>
        <h2>Thanks for contact!!</h2>
    </body>
    </html>

    三、两种不同的页面显示

      1、forms.py中默认的方式(简单测试)

         1)contact_author.html:

    <html>
    <style type="text/css">
        {# <ul class="errorlist">。。。</ul> #}
        {# ul标签下的class="errorlist"的属性进行渲染 #}{# 标签下的属性 #}
        ul.errorlist {
            margin: 0;
            padding: 0;
        }
        {# <ul class="errorlist"><li>单词个数低于4个!</li></ul> #}
        {# errorlist class下的 li标签内的元素进行渲染 #}{# 属性下一级的标签 #}
        .errorlist li {
            background-color: red;
            color: white;
            display: block;
            font-size: 10px;
            margin: 0 0 3px;
            padding: 4px 5px;
        }
        .field{
            background-color: gray;
        }
    </style>
    <head>
        <title>Contact us</title>
    </head>
    <body>
        {% if form.errors %}
            <p style="color: red;">
                Please correct the error{{ form.errors|pluralize }} below.
            </p>
        {% endif %}
    
        <form action="" method="post">
            <table>
                {{ form.as_table }}
            </table>
            <input type="submit" value="提交">
        </form>
    </body>
    </html>

       2)测试

          初次访问:

         

         打印结果:    

    <tr><th><label for="id_subject">主题:</label></th><td><input id="id_subject" maxlength="10" name="subject" type="text" /></td></tr>
    <tr><th><label for="id_email">Email:</label></th><td><input id="id_email" name="email" type="email" /></td></tr>
    <tr><th><label for="id_message">信息:</label></th><td><textarea cols="40" id="id_message" name="message" rows="10">
    </textarea></td></tr>
    False

      2、页面中自定义显示方式(详细测试)

        1)contact_author.html

    <html>
    <style type="text/css">
        {# <ul class="errorlist">。。。</ul> #}
        {# ul标签下的class="errorlist"的属性进行渲染 #}{# 标签下的属性 #}
        ul.errorlist {
            margin: 0;
            padding: 0;
        }
        {# <ul class="errorlist"><li>单词个数低于4个!</li></ul> #}
        {# errorlist class下的 li标签内的元素进行渲染 #}{# 属性下一级的标签 #}
        .errorlist li {
            background-color: red;
            color: white;
            display: block;
            font-size: 10px;
            margin: 0 0 3px;
            padding: 4px 5px;
        }
        .field{
            background-color: gray;
        }
    </style>
    <head>
        <title>Contact us</title>
    </head>
    <body>
        {% if form.errors %}
            <p style="color: red;">
                Please correct the error{{ form.errors|pluralize }} below.
            </p>
        {% endif %}
    
        <form action="" method="post">
            <div class="field">
                {# 自动生成的默认错误信息显示 #}
                {# 会被翻译成:<ul class="errorlist"><li>这个字段是必填项。</li></ul> #}
                {{ form.subject.errors }}
                <label for="id_subject">页面自定义的主题:</label>
                {{ form.subject }}
                {# 自定义的错误信息显示 #}
                {% if form.subject.errors%}
                <label for="id_self_def_error_info" style="color: red;">
                    *自定义错误信息:主题不能为空
                </label>
                {% endif %}
    
            </div>
            <div class="field">
                {{ form.email.errors }}
                <label for="id_email">页面中自定义的email:</label>
                {{ form.email }}
            </div>
            <div class="field">
                {{ form.message.errors }}
                <label for="id_message">页面中自定义的信息:</label>
                {{ form.message }}
            </div>
            <input type="submit" value="提交">
        </form>
    </body>
    </html>

       2)测试

        a)首次访问

         

         打印结果: 

    <tr><th><label for="id_subject">主题:</label></th><td><input id="id_subject" maxlength="10" name="subject" type="text" /></td></tr>
    <tr><th><label for="id_email">Email:</label></th><td><input id="id_email" name="email" type="email" /></td></tr>
    <tr><th><label for="id_message">信息:</label></th><td><textarea cols="40" id="id_message" name="message" rows="10">
    </textarea></td></tr>
    False

       b)输入正确格式并提交

        

        

        打印结果:

        

      c)输入错误格式并提交

        

        打印结果: 最终页面显示时,form类中定义的label文字,被自定义的内容替换

    <tr><th><label for="id_subject">主题:</label></th><td><ul class="errorlist"><li>这个字段是必填项。</li></ul><input id="id_subject" maxlength="10" name="subject" type="text" /></td></tr>
    <tr><th><label for="id_email">Email:</label></th><td><input id="id_email" name="email" type="email" value="aaa@sina.com" /></td></tr>
    <tr><th><label for="id_message">信息:</label></th><td><ul class="errorlist"><li>单词个数低于4个!</li></ul><textarea cols="40" id="id_message" name="message" rows="10">
    s</textarea></td></tr>
    数据不符合要求
    <ul class="errorlist"><li>这个字段是必填项。</li></ul>
    
    <ul class="errorlist"><li>单词个数低于4个!</li></ul>

         ps: 如果email格式不正确,页面会直接弹出提示,而不会提交到后台

        

    参考:http://djangobook.py3k.cn/2.0/chapter07/

  • 相关阅读:
    阿里云 Linux Centos7下安装Tomcat8
    Centos7.5中安装JDK1.8环境变量配置
    JAVA中的抽象类和接口
    Struts2框架
    [机器学习]--逻辑回归总结
    matlab-使用技巧
    机器学习-一对多(多分类)代码实现(matlab)
    机器学习-反向传播算法(BP)代码实现(matlab)
    线性回归代码实现(matlab)
    217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/edisonfeng/p/3779974.html
Copyright © 2020-2023  润新知