django-表單

1、從Request對象中獲取信息html

一、URL相關的信息python

屬性/方法 說明 舉例
request.path 除域名之外的請求路徑,以正斜槓開頭 「/hello/」
request.get_host() 主機名(一般所說的域名)

「127.0.0.1:8000」django

「www.example.com」瀏覽器

request.get_full_path() 請求路徑,可能包含查詢字符串 「/hello/?print=true」
request.is_secure() 若是經過HTTPS訪問,則此方法返回true,不然返回false TRUE或者false

二、其餘信息:app

(1)request.META:包含本次全部HTTP請求的Header信息(如用戶IP地址,用戶Agent(一般是瀏覽器名稱和版本號))函數

常見的鍵值:HTTP_REFERER:進站前連接網頁;post

      HTTP_USER_AGENT:瀏覽器的user-agent字符串;測試

      REMONT_ADDR:客戶端IP;ui

三、下來咱們來建立一個簡單的表單:url

#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),

    

四、測試完成以後來實現書籍的查詢;

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」關鍵字獲得圖三:

    

五、接下來咱們隊用戶的輸入進行一個簡單的驗證(不超多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個字符                                  正常提交

    

六、體驗站點聯繫表單:

咱們想要建立一個表單含有三個字段: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>

相關文章
相關標籤/搜索