• django-表单


    一、从Request对象中获取信息

    1、URL相关的信息

    属性/方法 说明 举例
    request.path 除域名以外的请求路径,以正斜杠开头 “/hello/”
    request.get_host() 主机名(通常所说的域名)

    “127.0.0.1:8000”

    “www.example.com”

    request.get_full_path() 请求路径,可能包含查询字符串 “/hello/?print=true”
    request.is_secure() 如果通过HTTPS访问,则此方法返回true,否则返回false TRUE或者false

    2、其他信息:

    (1)request.META:包含本次所有HTTP请求的Header信息(如用户IP地址,用户Agent(通常是浏览器名称和版本号))

    常见的键值:HTTP_REFERER:进站前链接网页;

          HTTP_USER_AGENT:浏览器的user-agent字符串;

          REMONT_ADDR:客户端IP;

    3、下来我们来创建一个简单的表单:

    #views.py
    def search_form(request):
        return  render_to_response('search_form.html')

    def search(request):
    if 'q' in request.GET:
    message = '您搜索了 :%r'% request.GET['q']
    else:
    message = '你提交了一个空表单'  #如果不进行判断,如果提交空表单就会出错
    return HttpResponse(message)
    #search_form.html
    <form action="/search/" method="get">
        <input type="text" name="q"/>
        <input type="submit" value="search">
    </form>
     url(r'^search-form/$',views.search_form),
     url(r'^search/$',views.search),

        

    4、测试完成之后来实现书籍的查询;

    def search(request):
        error = False
        if 'q' in request.GET:
            q = request.GET['q']
            if not q:
                error = True
            else:
                books = Book.objects.filter(title__icontains = q)   #__icontains查询关键字:模糊匹配,不区分大小写
                return render_to_response('search_results.html',
                                      {'books':books,'query':q})
        return render_to_response('search_form.html',
                                      {'error':error})
    <body>
    {% if error %}
    <p style="color:red">please submit a search term</p>
    {% endif %}
    <form action="" method="get">
        <input type="text" name="q"/>
        <input type="submit" value="search">
    </form>
    </body>
    <body>
    <p>you searched for:<strong>{{ query }}</strong></p>
    
    {% if books %}
    <p>Found {{ books|length }}book{{ books|pluralize }}.</p>  <!--单词的复数形式,如列表字符串个数大于1,返回s,否则返回空串-->
    <ul> 
    {
    % for book in books %}
      <li>{{ book.title }} : {{ book.publisher }}</li>
    {
    % endfor %}
    </ul>
    {
    % else %}
    <p>No books matched your search criteria</p>
    {
    % endif %}
    </body>

     访问127.0.0.1:60500/search-form/,如图一,若提交空表单,显示如图二;查询“python”关键字得到图三:

        

    5、接下来我们队用户的输入进行一个简单的验证(不超多20个字符):

    def search(request):
        errors = []
        if 'q' in request.GET:
            q = request.GET['q']
            if not q:
                errors.append('please submit a search term')
            elif len(q) > 20:
                errors.append('please enter at most 20 charactors')
            else:
                books = Book.objects.filter(title__icontains = q)   #__icontains查询关键字:模糊匹配,不区分大小写
                return render_to_response('search_results.html',
                                      {'books':books,'query':q})
        return render_to_response('search_form.html',
                                      {'errors':errors})
    #search_form.html
    <body>
    {% if errors %}
    <ul>
        {% for error in errors %}
        <li>{{ error }}</li>
        {% endfor %}
    </ul>
    {% endif %}
    <form action="" method="get">
        <input type="text" name="q"/>
        <input type="submit" value="search">
    </form>
    </body>

          提交空表单                              关键字超过20个字符                                  正常提交

        

    6、体验站点联系表单:

    我们想要创建一个表单含有三个字段:subject,message和email

     (1)先 在firstSite目录下(books的同级目录)新建一个app,使用命令:python manage.py startapp contact,然后再contact目录下新建一个名为forms.py的文件,在这个文件里面创建我们的Form类。

      django带有一个form库成为django.forms,这个库可以处理表单HTML的显示和验证;

    #    -*- coding:utf-8 -*-
    from django import forms    #引入form库
    
    class ContactForm(forms.Form):
        subject = forms.CharField(max_length= 100)  #设置最大值
        email = forms.EmailField(required= False,label= 'Your e-mail address')   #email为非必填选项
        message = forms.CharField(widget= forms.Textarea)  #设置HTML里面message的标签为textarea,而不是input type=‘text’

     (2)在我们的views.py文件中:

    #    -*- coding:utf-8 -*-
    from django.shortcuts import render
    from django.http import HttpResponseRedirect
    from django.shortcuts import render_to_response
    from django.core.mail import send_mail
    from contact.forms import ContactForm
    from django.template import RequestContext
    # Create your tests here.
    def contact(request):
        if request.method == 'POST':
            form = ContactForm(request.POST)
            if form.is_valid():     #检验输入数据是否合法
                cd = form.cleanded_data     #清理数据
                send_mail(      #发送邮件函数,四个必选参数:(主题,正文,寄信人,收件人)
                    cd['subject'],
                    cd['message'],
                    cd.get('email', 'noreply@example.com'),
                           ['siteowner@example.com'],
                )
                return  HttpResponseRedirect('/contact/thanks/')
        else:
            form = ContactForm(
                initial= {'subject': "it's nice"}  #设置初始值
            )
        return render_to_response('contact_form.html',
                                  {'form':form},
         ) 

     (3)在我们的Contact.html里: 

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>contact_form</title>
    </head>
    <body>
    <h1>Contact us</h1>
    {% if form.errors %}    <!--内置errors字典-->
    <p style="color:red">
        Please corrent the error{{ form.errors|pluralize }} below
    </p>
    {% endif %}
    
    <form action="" method="post">
        <table>
           {{ form.as_table }}      <!--按照<table>输出,还有其他形式的输出:form.as_ul(),form.as_p-->
        </table>
        <input type="submit" value="submit"/>
    </form>
    </body>
    </html>

     (4)接下来我们如果要自定义一些验证方式(比如说message字段不可以少于4个)可以在ContactForm类中定义函数:

    #    -*- coding:utf-8 -*-
    from django import forms    #引入form库
    
    class ContactForm(forms.Form):
        subject = forms.CharField(max_length= 100)
        email = forms.EmailField(required= False,label= 'Your e-mail address')   #email为非必填选项,自定义标签
        message = forms.CharField(widget= forms.Textarea)  #改变html显示
    
        def clean_message(self):    #命名规范:名称以clean_开头,以字段名称结束;
            message = self.cleaned_data['message']
            num_words = len(message.split())
            if num_words < 4:
                raise forms.ValidationError('not enough words!')    #如果不足,抛出异常
            return message

    (5)接下来我们来配置url,在firstSite目录下的urls配置:

    #    -*- coding:utf-8 -*-
    from django.conf.urls import url    #导入 django.conf.urls 模块下的url类
    from django.contrib import admin
    from django.conf.urls import url,include
    admin.autodiscover()
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^books/',include('books.urls')),
        url(r'^contact/',include('contact.urls')),
    ]

    (6)在Contact目录下的urls中配置:

    #    -*- coding:utf-8 -*-from django.conf.urls import url
    from . import views
    
    urlpatterns = [
        url(r'^contact/$',views.contact),
    ]

    (7)我们对其进行访问: 

         

    (7)如果你得到如下报错页面,

    可以按照以下步骤解决:

    (8)自动显示HTML是很方便的,但是我们在需要的时候也可以重写默认显示;{{ form.as_table}}和其他的方法可以帮你这个忙;每一个字段部件(input type='text',<select>,<textarea>等)都可以通过访问{{form.字段名}}进行单独的渲染;

    <form action="" method="post" class="form_1">{% csrf_token %}
        <div class="field">
            {{ form.subject.errors }}
            <label class="left" for="id_message">Subject:</label>
            {{ form.subject }}
        </div>
        <div class="field">
            {{ form.email.errors }}
            <label class="left" for="id_message">Your e-mail address:</label>
            {{ form.email }}
        </div>
        <div class="field">
            {{ form.message.errors }}
            <label class="left_last" for="id_message">Message:</label>
            {{ form.message }}
        </div>
        <!--<table>-->
           <!--{{ form.as_table }}      &lt;!&ndash;按照<table>输出,还有其他形式的输出:form.as_ul(),form.as_p&ndash;&gt;-->
        <!--</table>-->
        <input class="submit" type="submit" value="submit"/>
    </form>

  • 相关阅读:
    PHP观察者模式 (转)
    PHP单例模式 (转)
    PHP解决并发问题的几种实现(转)
    php结合redis实现高并发下的抢购、秒杀功能 (转)
    使用 redis 减少 秒杀库存 超卖思路 (转)
    mysql视图学习总结(转)
    mysql 存储过程
    PHP中的魔术方法和关键字
    bzoj3462DZY Loves Math II
    bzoj1453[Wc]Dface双面棋盘
  • 原文地址:https://www.cnblogs.com/cencenyue/p/8006514.html
Copyright © 2020-2023  润新知