Django初識

版本對應:html

學習本教程前你須要瞭解一些基礎的 Web 知識及 Python 2.x 基礎教程 或 Python 3.x 基礎教程python

Django 版本對應的 Python 版本:mysql

Django 版本 Python 版本
1.8 2.7, 3.2 , 3.3, 3.4, 3.5
1.9, 1.10 2.7, 3.4, 3.5
1.11 2.7, 3.4, 3.5, 3.6
2.0 3.4, 3.5, 3.6, 3.7
2.1, 2.2 3.5, 3.6, 3.7

 

安裝Django:sql

pip install Djangoshell

 

Django 管理工具

安裝 Django 以後,您如今應該已經有了可用的管理工具 django-admin。咱們可使用 django-admin 來建立一個項目:數據庫

咱們能夠來看下django-admin 的命令介紹:django

$ django-admin Type 'django-admin help <subcommand>' for help on a specific subcommand. Available subcommands: [django] check compilemessages createcachetable dbshell diffsettings dumpdata flush inspectdb loaddata makemessages makemigrations migrate runserver sendtestemail shell showmigrations sqlflush sqlmigrate sqlsequencereset squashmigrations startapp startproject test testserver ……省略部分……

建立第一個項目

使用 django-admin 來建立 HelloWorld 項目:瀏覽器

django-admin startproject HelloWorld

建立完成後咱們能夠查看下項目的目錄結構:安全

$ cd HelloWorld/ $ tree . |-- HelloWorld | |-- __init__.py | |-- settings.py | |-- urls.py | `-- wsgi.py `-- manage.py

目錄說明:服務器

  • HelloWorld: 項目的容器。
  • manage.py: 一個實用的命令行工具,可以讓你以各類方式與該 Django 項目進行交互。
  • HelloWorld/__init__.py: 一個空文件,告訴 Python 該目錄是一個 Python 包。
  • HelloWorld/settings.py: 該 Django 項目的設置/配置。
  • HelloWorld/urls.py: 該 Django 項目的 URL 聲明; 一份由 Django 驅動的網站"目錄"。
  • HelloWorld/wsgi.py: 一個 WSGI 兼容的 Web 服務器的入口,以便運行你的項目。

接下來咱們進入 HelloWorld 目錄輸入如下命令,啓動服務器:

python3 manage.py runserver 0.0.0.0:8000

0.0.0.0 讓其它電腦可鏈接到開發服務器,8000 爲端口號。若是不說明,那麼端口號默認爲 8000。

在瀏覽器輸入你服務器的 ip(這裏咱們輸入本機 IP 地址: 127.0.0.1:8000) 及端口號,若是正常啓動,輸出結果以下:

視圖和 URL 配置

在先前建立的 HelloWorld 目錄下的 HelloWorld 目錄新建一個 view.py 文件,並輸入代碼:

HelloWorld/HelloWorld/view.py 文件代碼:

from django.http import HttpResponse def hello(request): return HttpResponse("Hello world ! ")

接着,綁定 URL 與視圖函數。打開 urls.py 文件,刪除原來代碼,將如下代碼複製粘貼到 urls.py 文件中:

HelloWorld/HelloWorld/urls.py 文件代碼:

from django.conf.urls import url from . import view urlpatterns = [ url(r'^$', view.hello), ]

整個目錄結構以下:

$ tree
. |-- HelloWorld | |-- __init__.py | |-- __init__.pyc | |-- settings.py | |-- settings.pyc | |-- urls.py # url 配置 | |-- urls.pyc | |-- view.py # 添加的視圖文件 | |-- view.pyc # 編譯後的視圖文件 | |-- wsgi.py | `-- wsgi.pyc `-- manage.py

完成後,啓動 Django 開發服務器,並在瀏覽器訪問打開瀏覽器並訪問:

咱們也能夠修改如下規則:

HelloWorld/HelloWorld/urls.py 文件代碼:

from django.urls import path from . import view urlpatterns = [ path('hello/', view.hello), ]

經過瀏覽器打開 http://127.0.0.1:8000/hello,輸出結果以下:

注意:項目中若是代碼有改動,服務器會自動監測代碼的改動並自動從新載入,因此若是你已經啓動了服務器則不需手動重啓。

 

 

 

 

 

Django 模板

在上一章節中咱們使用 django.http.HttpResponse() 來輸出 "Hello World!"。該方式將數據與視圖混合在一塊兒,不符合 Django 的 MVC 思想。

本章節咱們將爲你們詳細介紹 Django 模板的應用,模板是一個文本,用於分離文檔的表現形式和內容。


模板應用實例

咱們接着上一章節的項目將在 HelloWorld 目錄底下建立 templates 目錄並創建 hello.html文件,整個目錄結構以下:

HelloWorld/ |-- HelloWorld | |-- __init__.py | |-- __init__.pyc | |-- settings.py | |-- settings.pyc | |-- urls.py | |-- urls.pyc | |-- view.py | |-- view.pyc | |-- wsgi.py | `-- wsgi.pyc |-- manage.py `-- templates `-- hello.html

hello.html 文件代碼以下:

HelloWorld/templates/hello.html 文件代碼:

<h1>{{ hello }}</h1>

從模板中咱們知道變量使用了雙括號。

接下來咱們須要向Django說明模板文件的路徑,修改HelloWorld/settings.py,修改 TEMPLATES 中的 DIRS 爲 [BASE_DIR+"/templates",],以下所示:

HelloWorld/HelloWorld/settings.py 文件代碼:

...TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR+"/templates",], # 修改位置 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] ...

咱們如今修改 view.py,增長一個新的對象,用於向模板提交數據:

HelloWorld/HelloWorld/view.py 文件代碼:

from django.shortcuts import render def hello(request): context = {} context['hello'] = 'Hello World!' return render(request, 'hello.html', context)

能夠看到,咱們這裏使用 render 來替代以前使用的 HttpResponse。render 還使用了一個字典 context 做爲參數。

context 字典中元素的鍵值 "hello" 對應了模板中的變量 "{{ hello }}"。

再訪問訪問 http://127.0.0.1:8000/hello,能夠看到頁面:

這樣咱們就完成了使用模板來輸出數據,從而實現數據與視圖分離。

接下來咱們將具體介紹模板中經常使用的語法規則。


Django 模板標籤

if/else 標籤

基本語法格式以下:

{% if condition %} ... display {% endif %}

或者:

{% if condition1 %} ... display 1 {% elif condition2 %} ... display 2 {% else %} ... display 3 {% endif %}

根據條件判斷是否輸出。if/else 支持嵌套。

{% if %} 標籤接受 and , or 或者 not 關鍵字來對多個變量作判斷 ,或者對變量取反( not ),例如:

{% if athlete_list and coach_list %} athletes  coaches 變量都是可用的。 {% endif %}

for 標籤

{% for %} 容許咱們在一個序列上迭代。

與Python的 for 語句的情形相似,循環語法是 for X in Y ,Y是要迭代的序列而X是在每個特定的循環中使用的變量名稱。

每一次循環中,模板系統會渲染在 {% for %} 和 {% endfor %} 之間的全部內容。

例如,給定一個運動員列表 athlete_list 變量,咱們可使用下面的代碼來顯示這個列表:

 

<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>

給標籤增長一個 reversed 使得該列表被反向迭代:

{% for athlete in athlete_list reversed %} ... {% endfor %}

能夠嵌套使用 {% for %} 標籤:

{% for athlete in athlete_list %} <h1>{{ athlete.name }}</h1> <ul> {% for sport in athlete.sports_played %} <li>{{ sport }}</li> {% endfor %} </ul> {% endfor %}

ifequal/ifnotequal 標籤

{% ifequal %} 標籤比較兩個值,當他們相等時,顯示在 {% ifequal %} 和 {% endifequal %} 之中全部的值。

下面的例子比較兩個模板變量 user 和 currentuser :

{% ifequal user currentuser %} <h1>Welcome!</h1> {% endifequal %}

和 {% if %} 相似, {% ifequal %} 支持可選的 {% else%} 標籤:8

{% ifequal section 'sitenews' %} <h1>Site News</h1> {% else %} <h1>No News Here</h1> {% endifequal %}

註釋標籤

Django 註釋使用 {# #}。

{# 這是一個註釋 #}

過濾器

模板過濾器能夠在變量被顯示前修改它,過濾器使用管道字符,以下所示:

{{ name|lower }}

{{ name }} 變量被過濾器 lower 處理後,文檔大寫轉換文本爲小寫。

過濾管道能夠被* 套接* ,既是說,一個過濾器管道的輸出又能夠做爲下一個管道的輸入:

{{ my_list|first|upper }}

以上實例將第一個元素並將其轉化爲大寫。

有些過濾器有參數。 過濾器的參數跟隨冒號以後而且老是以雙引號包含。 例如:

{{ bio|truncatewords:"30" }}

這個將顯示變量 bio 的前30個詞。

其餘過濾器:

  • addslashes : 添加反斜槓到任何反斜槓、單引號或者雙引號前面。
  • date : 按指定的格式字符串參數格式化 date 或者 datetime 對象,實例:
    {{ pub_date|date:"F j, Y" }}
  • length : 返回變量的長度。

include 標籤

{% include %} 標籤容許在模板中包含其它的模板的內容。

下面這個例子都包含了 nav.html 模板:

{% include "nav.html" %}

模板繼承

模板能夠用繼承的方式來實現複用。

接下來咱們先建立以前項目的 templates 目錄中添加 base.html 文件,代碼以下:

HelloWorld/templates/base.html 文件代碼:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body> <h1>Hello World!</h1> <p>菜鳥教程 Django 測試。</p> {% block mainbody %} <p>original</p> {% endblock %} </body> </html>

以上代碼中,名爲 mainbody 的 block 標籤是能夠被繼承者們替換掉的部分。

全部的 {% block %} 標籤告訴模板引擎,子模板能夠重載這些部分。

hello.html 中繼承 base.html,並替換特定 block,hello.html 修改後的代碼以下:

HelloWorld/templates/hello.html 文件代碼:

{%extends "base.html" %} {% block mainbody %} <p>繼承了 base.html 文件</p> {% endblock %}

第一行代碼說明 hello.html 繼承了 base.html 文件。能夠看到,這裏相同名字的 block 標籤用以替換 base.html 的相應 block。

從新訪問地址 http://127.0.0.1:8000/hello,輸出結果以下:

 

 

 

 

Django 模型

Django 對各類數據庫提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

Django 爲這些數據庫提供了統一的調用API。 咱們能夠根據本身業務需求選擇不一樣的數據庫。

MySQL 是 Web 應用中最經常使用的數據庫。本章節咱們將以 Mysql 做爲實例進行介紹。你能夠經過本站的 MySQL 教程 瞭解更多Mysql的基礎知識。

若是你沒安裝 mysql 驅動,能夠執行如下命令安裝:

sudo pip install mysqlclient

數據庫配置

咱們在項目的 settings.py 文件中找到 DATABASES 配置項,將其信息修改成:

HelloWorld/HelloWorld/settings.py: 文件代碼:

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 或者使用 mysql.connector.django 'NAME': 'test', 'USER': 'test', 'PASSWORD': 'test123', 'HOST':'localhost', 'PORT':'3306', } }

這裏添加了中文註釋,因此你須要在 HelloWorld/settings.py 文件頭部添加 # -*- coding: UTF-8 -*-

上面包含數據庫名稱和用戶的信息,它們與 MySQL 中對應數據庫和用戶的設置相同。Django 根據這一設置,與 MySQL 中相應的數據庫和用戶鏈接起來。


定義模型

建立 APP

Django規定,若是要使用模型,必需要建立一個app。咱們使用如下命令建立一個 TestModel 的 app:

django-admin startapp TestModel

目錄結構以下:

HelloWorld |-- TestModel | |-- __init__.py | |-- admin.py | |-- models.py | |-- tests.py | `-- views.py

咱們修改 TestModel/models.py 文件,代碼以下:

HelloWorld/TestModel/models.py: 文件代碼:

# models.py from django.db import models class Test(models.Model): name = models.CharField(max_length=20)

以上的類名錶明瞭數據庫表名,且繼承了models.Model,類裏面的字段表明數據表中的字段(name),數據類型則由CharField(至關於varchar)、DateField(至關於datetime), max_length 參數限定長度。

接下來在settings.py中找到INSTALLED_APPS這一項,以下:

INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'TestModel', # 添加此項 )

在命令行中運行:

$ python manage.py migrate # 建立表結構 $ python manage.py makemigrations TestModel # 讓 Django 知道咱們在咱們的模型有一些變動 $ python manage.py migrate TestModel # 建立表結構

看到幾行 "Creating table…" 的字樣,你的數據表就建立好了。

Creating tables ... …… Creating table TestModel_test #咱們自定義的表 ……

表名組成結構爲:應用名_類名(如:TestModel_test)。

注意:儘管咱們沒有在models給表設置主鍵,可是Django會自動添加一個id做爲主鍵。


數據庫操做

接下來咱們在 HelloWorld 目錄中添加 testdb.py 文件(下面介紹),並修改 urls.py:

HelloWorld/HelloWorld/urls.py: 文件代碼:

from django.conf.urls import * from . import view,testdb urlpatterns = [ url(r'^hello$', view.hello), url(r'^testdb$', testdb.testdb), ]

添加數據

添加數據須要先建立對象,而後再執行 save 函數,至關於SQL中的INSERT:

HelloWorld/HelloWorld/testdb.py: 文件代碼:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # 數據庫操做 def testdb(request): test1 = Test(name='runoob') test1.save() return HttpResponse("<p>數據添加成功!</p>")

訪問 http://127.0.0.1:8000/testdb 就能夠看到數據添加成功的提示。

輸出結果以下:

獲取數據

Django提供了多種方式來獲取數據庫的內容,以下代碼所示:

HelloWorld/HelloWorld/testdb.py: 文件代碼:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # 數據庫操做 def testdb(request): # 初始化 response = "" response1 = "" # 經過objects這個模型管理器的all()得到全部數據行,至關於SQL中的SELECT * FROM list = Test.objects.all() # filter至關於SQL中的WHERE,可設置條件過濾結果 response2 = Test.objects.filter(id=1) # 獲取單個對象 response3 = Test.objects.get(id=1) # 限制返回的數據 至關於 SQL 中的 OFFSET 0 LIMIT 2; Test.objects.order_by('name')[0:2] #數據排序 Test.objects.order_by("id") # 上面的方法能夠連鎖使用 Test.objects.filter(name="runoob").order_by("id") # 輸出全部數據 for var in list: response1 += var.name + " " response = response1 return HttpResponse("<p>" + response + "</p>")

更新數據

修改數據可使用 save() 或 update():

HelloWorld/HelloWorld/testdb.py: 文件代碼:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # 數據庫操做 def testdb(request): # 修改其中一個id=1的name字段,再save,至關於SQL中的UPDATE test1 = Test.objects.get(id=1) test1.name = 'Google' test1.save() # 另一種方式 #Test.objects.filter(id=1).update(name='Google') # 修改全部的列 # Test.objects.all().update(name='Google') return HttpResponse("<p>修改爲功</p>")

刪除數據

刪除數據庫中的對象只需調用該對象的delete()方法便可:

HelloWorld/HelloWorld/testdb.py: 文件代碼:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # 數據庫操做 def testdb(request): # 刪除id=1的數據 test1 = Test.objects.get(id=1) test1.delete() # 另一種方式 # Test.objects.filter(id=1).delete() # 刪除全部數據 # Test.objects.all().delete() return HttpResponse("<p>刪除成功</p>")
 
 

Django 表單

HTML表單是網站交互性的經典方式。 本章將介紹如何用Django對用戶提交的表單數據進行處理。


HTTP 請求

HTTP協議以"請求-回覆"的方式工做。客戶發送請求時,能夠在請求中附加數據。服務器經過解析請求,就能夠得到客戶傳來的數據,並根據URL來提供特定的服務。

GET 方法

咱們在以前的項目中建立一個 search.py 文件,用於接收用戶的請求:

/HelloWorld/HelloWorld/search.py 文件代碼:

# -*- coding: utf-8 -*- from django.http import HttpResponse from django.shortcuts import render_to_response # 表單 def search_form(request): return render_to_response('search_form.html') # 接收請求數據 def search(request): request.encoding='utf-8' if 'q' in request.GET and request.GET['q']: message = '你搜索的內容爲: ' + request.GET['q'] else: message = '你提交了空表單' return HttpResponse(message)

在模板目錄 templates 中添加 search_form.html 表單:

/HelloWorld/templates/search_form.html 文件代碼:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body> <form action="/search" method="get"> <input type="text" name="q"> <input type="submit" value="搜索"> </form> </body> </html>

urls.py 規則修改成以下形式:

/HelloWorld/HelloWorld/urls.py 文件代碼:

from django.conf.urls import url from . import view,testdb,search urlpatterns = [ url(r'^hello$', view.hello), url(r'^testdb$', testdb.testdb), url(r'^search-form$', search.search_form), url(r'^search$', search.search), ]

訪問地址 http://127.0.0.1:8000/search-form 並搜索,結果以下所示:

POST 方法

上面咱們使用了GET方法。視圖顯示和請求處理分紅兩個函數處理。

提交數據時更經常使用POST方法。咱們下面使用該方法,並用一個URL和處理函數,同時顯示視圖和處理請求。

咱們在 templates 建立 post.html:

/HelloWorld/templates/post.html 文件代碼:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body> <form action="/search-post" method="post"> {% csrf_token %} <input type="text" name="q"> <input type="submit" value="Submit"> </form> <p>{{ rlt }}</p> </body> </html>

在模板的末尾,咱們增長一個 rlt 記號,爲表格處理結果預留位置。

表格後面還有一個{% csrf_token %}的標籤。csrf 全稱是 Cross Site Request Forgery。這是Django提供的防止假裝提交請求的功能。POST 方法提交的表格,必須有此標籤。

在HelloWorld目錄下新建 search2.py 文件並使用 search_post 函數來處理 POST 請求:

/HelloWorld/HelloWorld/search2.py 文件代碼:

# -*- coding: utf-8 -*- from django.shortcuts import render from django.views.decorators import csrf # 接收POST請求數據 def search_post(request): ctx ={} if request.POST: ctx['rlt'] = request.POST['q'] return render(request, "post.html", ctx)

urls.py 規則修改成以下形式:

/HelloWorld/HelloWorld/urls.py 文件代碼:

from django.conf.urls import url from . import view,testdb,search,search2 urlpatterns = [ url(r'^hello$', view.hello), url(r'^testdb$', testdb.testdb), url(r'^search-form$', search.search_form), url(r'^search$', search.search), url(r'^search-post$', search2.search_post), ]

訪問 http://127.0.0.1:8000/search-post 顯示結果以下:

完成以上實例後,咱們的目錄結構爲:

HelloWorld |-- HelloWorld | |-- __init__.py | |-- __init__.pyc | |-- search.py | |-- search.pyc | |-- search2.py | |-- search2.pyc | |-- settings.py | |-- settings.pyc | |-- testdb.py | |-- testdb.pyc | |-- urls.py | |-- urls.pyc | |-- view.py | |-- view.pyc | |-- wsgi.py | `-- wsgi.pyc |-- TestModel | |-- __init__.py | |-- __init__.pyc | |-- admin.py | |-- admin.pyc | |-- apps.py | |-- migrations | | |-- 0001_initial.py | | |-- 0001_initial.pyc | | |-- __init__.py | | `-- __init__.pyc | |-- models.py | |-- models.pyc | |-- tests.py | `-- views.py |-- db.sqlite3 |-- manage.py `-- templates |-- base.html |-- hello.html |-- post.html `-- search_form.html

Request 對象

每一個 view 函數的第一個參數是一個 HttpRequest 對象,就像下面這個 hello() 函數:

from django.http import HttpResponse def hello(request): return HttpResponse("Hello world")

HttpRequest對象包含當前請求URL的一些信息:

屬性

描述

path

請求頁面的全路徑,不包括域名—例如, "/hello/"。

method

請求中使用的HTTP方法的字符串表示。全大寫表示。例如:

if request.method == 'GET':
    do_something()
elif request.method == 'POST':
    do_something_else()

GET

包含全部HTTP GET參數的類字典對象。參見QueryDict 文檔。

POST

包含全部HTTP POST參數的類字典對象。參見QueryDict 文檔。

服務器收到空的POST請求的狀況也是有可能發生的。也就是說,表單form經過HTTP POST方法提交請求,可是表單中能夠沒有數據。所以,不能使用語句if request.POST來判斷是否使用HTTP POST方法;應該使用if request.method == "POST" (參見本表的method屬性)。

注意: POST不包括file-upload信息。參見FILES屬性。

REQUEST

爲了方便,該屬性是POST和GET屬性的集合體,可是有特殊性,先查找POST屬性,而後再查找GET屬性。借鑑PHP's $_REQUEST。

例如,若是GET = {"name": "john"} 和POST = {"age": '34'},則 REQUEST["name"] 的值是"john", REQUEST["age"]的值是"34".

強烈建議使用GET and POST,由於這兩個屬性更加顯式化,寫出的代碼也更易理解。

COOKIES

包含全部cookies的標準Python字典對象。Keys和values都是字符串。

FILES

包含全部上傳文件的類字典對象。FILES中的每一個Key都是<input type="file" name="" />標籤中name屬性的值. FILES中的每一個value 同時也是一個標準Python字典對象,包含下面三個Keys:

  • filename: 上傳文件名,用Python字符串表示
  • content-type: 上傳文件的Content type
  • content: 上傳文件的原始內容

注意:只有在請求方法是POST,而且請求頁面中<form>有enctype="multipart/form-data"屬性時FILES才擁有數據。不然,FILES 是一個空字典。

META

包含全部可用HTTP頭部信息的字典。 例如:

  • CONTENT_LENGTH
  • CONTENT_TYPE
  • QUERY_STRING: 未解析的原始查詢字符串
  • REMOTE_ADDR: 客戶端IP地址
  • REMOTE_HOST: 客戶端主機名
  • SERVER_NAME: 服務器主機名
  • SERVER_PORT: 服務器端口

META 中這些頭加上前綴HTTP_最爲Key, 例如:

  • HTTP_ACCEPT_ENCODING
  • HTTP_ACCEPT_LANGUAGE
  • HTTP_HOST: 客戶發送的HTTP主機頭信息
  • HTTP_REFERER: referring頁
  • HTTP_USER_AGENT: 客戶端的user-agent字符串
  • HTTP_X_BENDER: X-Bender頭信息

user

是一個django.contrib.auth.models.User 對象,表明當前登陸的用戶。

若是訪問用戶當前沒有登陸,user將被初始化爲django.contrib.auth.models.AnonymousUser的實例。

你能夠經過user的is_authenticated()方法來辨別用戶是否登陸:

 

if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users.

只有激活Django中的AuthenticationMiddleware時該屬性纔可用

session

惟一可讀寫的屬性,表明當前會話的字典對象。只有激活Django中的session支持時該屬性纔可用。

raw_post_data

原始HTTP POST數據,未解析過。 高級處理時會有用處。

Request對象也有一些有用的方法:

方法 描述
__getitem__(key) 返回GET/POST的鍵值,先取POST,後取GET。若是鍵不存在拋出 KeyError。
這是咱們可使用字典語法訪問HttpRequest對象。
例如,request["foo"]等同於先request.POST["foo"] 而後 request.GET["foo"]的操做。
has_key() 檢查request.GET or request.POST中是否包含參數指定的Key。
get_full_path() 返回包含查詢字符串的請求路徑。例如, "/music/bands/the_beatles/?print=true"
is_secure() 若是請求是安全的,返回True,就是說,發出的是HTTPS請求。

QueryDict對象

在HttpRequest對象中, GET和POST屬性是django.http.QueryDict類的實例。

QueryDict相似字典的自定義類,用來處理單鍵對應多值的狀況。

QueryDict實現全部標準的詞典方法。還包括一些特有的方法:

方法 描述

__getitem__

和標準字典的處理有一點不一樣,就是,若是Key對應多個Value,__getitem__()返回最後一個value。

__setitem__

設置參數指定key的value列表(一個Python list)。注意:它只能在一個mutable QueryDict 對象上被調用(就是經過copy()產生的一個QueryDict對象的拷貝).

get()

若是key對應多個value,get()返回最後一個value。

update()

參數能夠是QueryDict,也能夠是標準字典。和標準字典的update方法不一樣,該方法添加字典 items,而不是替換它們:

>>> q = QueryDict('a=1') >>> q = q.copy() # to make it mutable >>> q.update({'a': '2'}) >>> q.getlist('a') ['1', '2'] >>> q['a'] # returns the last ['2']

items()

和標準字典的items()方法有一點不一樣,該方法使用單值邏輯的__getitem__():

>>> q = QueryDict('a=1&a=2&a=3') >>> q.items() [('a', '3')]

values()

和標準字典的values()方法有一點不一樣,該方法使用單值邏輯的__getitem__():

此外, QueryDict也有一些方法,以下表:

方法 描述

copy()

返回對象的拷貝,內部實現是用Python標準庫的copy.deepcopy()。該拷貝是mutable(可更改的) — 就是說,能夠更改該拷貝的值。

getlist(key)

返回和參數key對應的全部值,做爲一個Python list返回。若是key不存在,則返回空list。 It's guaranteed to return a list of some sort..

setlist(key,list_)

設置key的值爲list_ (unlike __setitem__()).

appendlist(key,item)

添加item到和key關聯的內部list.

setlistdefault(key,list)

和setdefault有一點不一樣,它接受list而不是單個value做爲參數。

lists()

和items()有一點不一樣, 它會返回key的全部值,做爲一個list, 例如:

>>> q = QueryDict('a=1&a=2&a=3') >>> q.lists() [('a', ['1', '2', '3'])]

urlencode()

返回一個以查詢字符串格式進行格式化後的字符串(e.g., "a=2&b=3&b=5").

相關文章
相關標籤/搜索