小说转自:

Forms

HTML
form是相互网页的支柱。上面来学学一下关于使用Django管理用户提交的表单数据,验证等职能。

咱俩将探究HttpRequest和Form对象。

  • request中隐含的音信

在views.py中的每二个用来体现页面包车型大巴函数都亟需以request作为第一个函数参数。request包括了一部分有用

的信息,如:

request.path               除去了域名和端口的拜访路线,

request.get_永利开户送38元体验金,host       域名+端口音讯

request.get_full_path()   全部路子,包括传递的参数

requets.is_secure()     是或不是利用https实行链接

永利开户送38元体验金 1

永利开户送38元体验金 2

再有3个特意的性子request.META,它是多少个dict类型,包括了颇具HTTP
header新闻,然而也要依据用户

的莫过于条件来支配。如

HTTP_REFERER

HTTP_USER_AGENT   用户使用的浏览器消息

REMOTE_ADDLacrosse     用户的IP,假设运用代理,也足以显得出来

(有为数不少质量,只是截图了一些)

永利开户送38元体验金 3  

并不是每2个用户提交的头消息都千篇一律,所以在读取的时候,要思考部分非常情形,举个例子取不到对应的值的情景。

能够行使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是1个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.’
        #只是简短的归来1个response对象,因为尚未利用模块,所以也不用渲染数据Context
        return
HttpResponse(message)

永利开户送38元体验金 4 

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

 

有关表单验证

可以在server端实行,一时会加重server担当,也足以运用Javascript在client端进行。有某个急需留意的是,

不怕你利用了javascript在client进行了认证,依旧要求在server端对用户提交的数量进行复核,比方某个人

会在浏览器中禁止使用javascript,也稍微人会来搞注入攻击。同理可得,不能够相信用户提交的交由,实行防卫性编码。

 

有关利用重定向

您应当总是在1个得逞拍卖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类的新闻。

永利开户送38元体验金 5 

可以看出打字与印刷出来的f的新闻实际是网页格式的。

也足以改换暗中同意表格的格式。

永利开户送38元体验金 6 

此处的<table>,<ul>都未有包蕴在出口里,所以能够随意地增加行等。

除此而外打字与印刷出整个form的HTML内容,还能打字与印刷出局的字段的开始和结果。

永利开户送38元体验金 7 

 

还是能够选拔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的品种。

永利开户送38元体验金 8

 

如何在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>

永利开户送38元体验金 9 

在布局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’)

 

透过 为知笔记 发表

效果如图

永利开户送38元体验金 10

调用很有利

 

[html] view plaincopyprint?

  1. {% import “JcyHelperBundle:tmp:jcyForm.html.twig” as forms %} 
  2. {{ forms.jcyForm(dbForm,path(‘JcyHelperBundle_db_set’),’Connect’)
    }} 

    {% import “JcyHelperBundle:tmp:jcyForm.html.twig” as forms %} {{ forms.jcyForm(dbForm,path(‘JcyHelperBundle_db_set’),’Connect’) }}

如今上源代码

[html] view plaincopyprint?

  1. {% macro jcyForm(form,action,submit_name,onSubmitJs) %} 
  2. <formaction=”{{ action }}”method=”post”onsubmit=”{{
    onSubmitJs|default(”) }}” {{ form_enctype(form) }}> 
  3. {% if form.vars.errors|length >0 %} 
  4. <divclass=”alert alert-error”> 
  5. {% for error in form.vars.errors %} 
  6. {% if loop.index>1 %}<br>{% endif %} 
  7. {{ error.messageTemplate|trans(error.messageParameters,
    ‘validators’) }} 
  8. {% endfor %} 
  9. </div> 
  10. {% endif %} 
  11. {% for key,v in form.children %} 
  12. {% if key != ‘_token’ %} 
  13. <divclass=”control-group{% if v.vars.errors|length >0 %}
    error{% endif %}”> 
  14.     <divclass=”input-prepend”> 
  15.     <labelclass=”control-label
    add-on”style=”width:60px;text-align:right”for=”{{v.vars.id}}”>{{v.vars.label}}
    :</label> 
  16.         <divclass=”controls”> 
  17.             {{ form_widget(v) }} 
  18.             <spanclass=”help-inline”> 
  19.             {% if v.vars.errors|length >0 %} 
  20.             {% for error in v.vars.errors %} 
  21.             {% if loop.index>1 %},{% endif %} 
  22.             {{ error.messageTemplate|trans(error.messageParameters,
    ‘validators’) }} 
  23.             {% endfor %} 
  24.             {% endif %} 
  25.             </span> 
  26.         </div> 
  27.     </div> 
  28. </div> 
  29. {% endif %} 
  30. {% endfor %} 
  31. {{ form_rest(form) }} 
  32. <inputtype=submitid=”submit_btn”class=”btn-primary
    span2″value=”{{ submit_name }}”> 
  33. </form> 
  34. {% endmacro %} 

相关文章