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 }} <!–按照<table>輸出,還有其餘形式的輸出:form.as_ul(),form.as_p–>--> <!--</table>--> <input class="submit" type="submit" value="submit"/> </form>