Django框架搭建(windows系統)

Django框架搭建(windows系統)

1、Django簡介

開放源代碼的Web應用框架,由Python語言編寫,一個大而全的框架。css

1.web框架介紹

具體介紹Django以前,必須先介紹WEB框架等概念。html

web框架: 別人已經設定好的一個web網站模板,你學習它的規則,而後「填空」或「修改」成你本身須要的樣子。前端

通常web框架的架構是這樣的:python

其它基於python的web框架,如tornado、flask、webpy都是在這個範圍內進行增刪裁剪的。例如tornado用的是本身的異步非阻塞「wsgi」,flask則只提供了最精簡和基本的框架。Django則是直接使用了WSGI,並實現了大部分功能。mysql

2. MVC/MTV介紹

(1)MVC:全名Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯彙集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不須要從新編寫業務邏輯。web

(2)通俗解釋:一種文件的組織和管理形式!不要被縮寫嚇到了,這其實就是把不一樣類型的文件放到不一樣的目錄下的一種方法,而後取了個高大上的名字。固然,它帶來的好處有不少,好比先後端分離,鬆耦合等等。       正則表達式

(3)模型(model):定義數據庫相關的內容,通常放在models.py文件中。sql

(4)視圖(view):定義HTML等靜態網頁文件相關,也就是那些html、css、js等前端的東西。數據庫

(5)控制器(controller):定義業務邏輯相關,就是你的主要代碼。  django

(6)MTV:有些WEB框架以爲MVC的字面意思很彆扭,就給它改了一下。view再也不是HTML相關,而是主業務邏輯了,至關於控制器。html被放在Templates中,稱做模板,因而MVC就變成了MTV。這其實就是一個文字遊戲,和MVC本質上是同樣的,換了個名字和叫法而已,換湯不換藥。

3.Django的MTV模型組織

目錄分開,就必須有機制將他們在內裏進行耦合。在Django中,urls、orm、static、settings等起着重要的做用。一個典型的業務流程是以下圖所示:

那麼咱們學Django學的是什麼?

1. 目錄結構規範

2. urls路由方式

3. settings配置

4. ORM操做

5. 模板渲染

6.其它

2、Diango安裝(windows系統)

1,pip3命令安裝方式

 win+r,調出cmd,運行命令:

pip3 install django

2,配置系統環境變量

    配置環境變量,將這幾個目錄添加到系統環境變量中:D:\Python36\Lib\site-packages\django;D:\Python36\Scripts 

 在環境變量的path後面加入:

;D:\Python36\Lib\site-packages\django;D:\Python36\Scripts 

    添加完成後就可使用Django的django-admin.py命令新建工程了。 

    測試是否配置成功,cmd輸入:

>>> python
>>> import django
>>> django.get_version()

  出現以下內容,即表示成功;

三,建立django項目(windows系統)

1,建立django應用

安裝django後會有django-admin命令,經過django-admin startproject mysite便可建立(能夠先切換到某個文件夾做爲工程的文件夾);

切換到工做目錄:cd /d E:\DjangoWorks

進入目錄經過python manage.py runserver(或者python manage.py runserver 0.0.0.0:8000【0.0.0.0 讓其它電腦可鏈接到開發服務器,8000 爲端口號。若是不說明,那麼端口號默認爲 8000】).啓動應用

訪問地址:http://127.0.0.1:8000/

 2,django工程結構

(1)manage.py:django項目管理文件

(2)templates目錄(手動建立):html文件存放也就是MTV中的T

(3)settings.py:主配置文件

(4)urls.py:url路由文件

(5)wegi.py:網絡通訊接口

3.視圖和 URL 配置

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

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

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

from django.conf.urls import url
from . import view

urlpatterns = [
    url(r'^$', view.hello),
]

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

(3)咱們也能夠修改如下規則,urls.py 文件代碼:

from django.conf.urls import url
from . import view

urlpatterns = [
    url(r'^hello$', view.hello),
]

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

 

(4)url() 函數

  Django url() 能夠接收四個參數,分別是兩個必選參數:regex、view 和兩個可選參數:kwargs、name,接下來詳細介紹這四個參數。

  • regex: 正則表達式,與之匹配的 URL 會執行對應的第二個參數 view。
  • view: 用於執行與正則表達式匹配的 URL 請求。
  • kwargs: 視圖使用的字典類型的參數。
  • name: 用來反向獲取 URL。

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

4、Django 模板

1,django模版

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

Django 模板的應用,模板是一個文本,用於分離文檔的表現形式和內容。

mysite目錄底下建立 templates 目錄並創建 hello.html文件,hello.html 文件代碼以下:

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

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

接下來咱們須要向Django說明模板文件的路徑,修改HelloWorld/settings.py,修改 TEMPLATES 中的 DIRS 爲 [BASE_DIR+"/templates",],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,增長一個新的對象,用於向模板提交數據,view.py 文件代碼:

#from django.http import HttpResponse
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,能夠看到頁面:

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

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

2,Django 模板標籤

(1)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 %}

(2)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 %}

(3)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 %}

(4)註釋標籤:

Django 註釋使用 {# #}。

{# 這是一個註釋 #}

(5)過濾器:

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

{{ name|lower }}

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

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

{{ my_list|first|upper }}

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

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

{{ bio|truncatewords:"30" }}

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

其餘過濾器:

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

(6)include 標籤:

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

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

{% include "nav.html" %}

3,模板繼承:

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

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

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Django教程(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 修改後的代碼以下:

{% 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,輸出結果以下:

5、 Django 模型

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

Django 爲這些數據庫提供了統一的調用API。

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

pip install mysqlclient#只適用Python2.x版本

#Python3.x版本:在tmode/__init__.py中增長代碼
import pymysql
pymysql.install_as_MySQLdb()

1,數據庫配置

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

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

2,定義模型

建立 APP

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

django-admin startapp tmode

修改 tmode/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',
    'tmode',               # 添加此項
)

在命令行中運行:

python manage.py migrate   # 建立表結構

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

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

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

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

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

3,數據庫操做

 在 mysite目錄中添加 testdb.py 文件(下面介紹),並修改 urls.py:

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

(1)添加數據

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

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

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

輸出結果以下:

(2)獲取數據

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

# -*- 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>")

訪問 http://127.0.0.1:8000/testdb 就能夠看到數據。

輸出結果以下:

(3)更新數據

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

# -*- 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='Baidu')
    
    # 修改全部的列
    # Test.objects.all().update(name='Google_all')
    
    return HttpResponse("<p>修改爲功</p>")

訪問 http://127.0.0.1:8000/testdb 就能夠看到,輸出結果以下:

(4)刪除數據

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

# -*- 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>")

訪問 http://127.0.0.1:8000/testdb 就能夠看到,輸出結果以下: 

6、Django 表單

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

1,HTTP 請求

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

(1)GET 方法

項目中建立一個 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:
        message = '你搜索的內容爲: ' + request.GET['q']
    else:
        message = '你提交了空表單'
    return HttpResponse(message)

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

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

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 並搜索,結果以下所示:

 

(2)POST 方法

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

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

咱們在 templates 建立 post.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Python教程</title>
</head>
<body>
    <form action="/search_post" method="post">
        <!--csrf 全稱是 Cross Site Request Forgery。Django提供的防止假裝提交請求的功能。POST 方法提交的表格,必須有此標籤。-->
        {% csrf_token %}
        <input type="text" name="q">
        <input type="submit" value="搜索">
    </form>
    <!--模板的末尾,增長一個 rlt 記號,爲表格處理結果預留位置-->
    <p>{{ rlt }}</p>
</body>
</html>

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

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

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

# -*- 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 規則修改成以下形式:

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 顯示結果以下:

 

 2,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請求。

 

 

 

 

 

 

 

 

 

3,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").

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7、Django Admin 管理工具

Django 提供了基於 web 的管理工具。

Django 自動管理工具是 django.contrib 的一部分。你能夠在項目的 settings.py 中的 INSTALLED_APPS 看到它:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

django.contrib是一套龐大的功能集,它是Django基本代碼的組成部分。

1,激活管理工具

一般咱們在生成項目時會在 urls.py 中自動設置好,咱們只需去掉註釋便可。

配置項以下所示:

# urls.py
from django.conf.urls import url
from django.contrib import admin
 
urlpatterns = [
    url(r'^admin/', admin.site.urls),
]

當這一切都配置好後,Django 管理工具就能夠運行了。

2,使用管理工具

啓動開發服務器,而後在瀏覽器中訪問 http://127.0.0.1:8000/admin/,獲得以下界面:

你能夠經過命令 python manage.py createsuperuser 來建立超級用戶,以下所示:

e:\DjangoWorks\mysite>python manage.py createsuperuser
Username (leave blank to use 'administrator'): admin
Email address: admin@python.com
Password:
Password (again):
Superuser created successfully.

以後輸入用戶名密碼登陸,界面以下:

爲了讓 admin 界面管理某個數據模型,咱們須要先註冊該數據模型到 admin。好比,咱們以前在 tmode中已經建立了模型 Test 。修改 tmode/admin.py:

from django.contrib import admin
from tmode.models import Test
 
# Register your models here.
admin.site.register(Test)

刷新後便可看到 Testmodel 數據表:

3,複雜模型

管理頁面的功能強大,徹底有能力處理更加複雜的數據模型。

先在 tmode/models.py 中增長一個更復雜的數據模型:

from django.db import models

# Create your models here.
class Test(models.Model):
    name = models.CharField(max_length=20)

class Contact(models.Model):
    name = models.CharField(max_length=200)
    age = models.IntegerField(default=0)
    email = models.EmailField()
    def __unicode__(self):
        return self.name

class Tag(models.Model):
    #在django2.0後,定義外鍵和一對一關係的時候須要加on_delete選項,此參數爲了不兩個表裏的數據不一致問題,否則會報錯(老版本中models.CASCADE參數是默認的)
    contact = models.ForeignKey(Contact,on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    def __unicode__(self):
        return self.name

這裏有兩個表。Tag 以 Contact 爲外部鍵。一個 Contact 能夠對應多個 Tag。

咱們還能夠看到許多在以前沒有見過的屬性類型,好比 IntegerField 用於存儲整數。

在 tmode/admin.py 註冊多個模型並顯示:

from django.contrib import admin
from TestModel.models import Test,Contact,Tag
 
# Register your models here.
admin.site.register([Test, Contact, Tag])

刷新管理頁面,顯示結果以下:

在以上管理工具咱們就能進行復雜模型操做。

若是你以前還未建立表結構,可以使用如下命令建立:

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

 4,自定義表單

 咱們能夠自定義管理頁面,來取代默認的頁面。好比上面的 "add" 頁面。咱們想只顯示 name 和 email 部分。修改 tmode/admin.py:

from django.contrib import admin
from TestModel.models import Test,Contact,Tag
 
# Register your models here.
class ContactAdmin(admin.ModelAdmin):
    fields = ('name', 'email')
 
admin.site.register(Contact, ContactAdmin)
admin.site.register([Test, Tag])

以上代碼定義了一個 ContactAdmin 類,用以說明管理頁面的顯示格式。

裏面的 fields 屬性定義了要顯示的字段。

因爲該類對應的是 Contact 數據模型,咱們在註冊的時候,須要將它們一塊兒註冊。顯示效果以下:

咱們還能夠將輸入欄分塊,每一個欄也能夠定義本身的格式。修改 TestModel/admin.py爲:

from django.contrib import admin
from TestModel.models import Test,Contact,Tag
 
# Register your models here.
class ContactAdmin(admin.ModelAdmin):
    fieldsets = (
        ['Main',{
            'fields':('name','email'),
        }],
        ['Advance',{
            'classes': ('collapse',), # CSS
            'fields': ('age',),
        }]
    )
 
admin.site.register(Contact, ContactAdmin)
admin.site.register([Test, Tag])

上面的欄目分爲了 Main 和 Advance 兩部分。classes 說明它所在的部分的 CSS 格式。這裏讓 Advance 部分隱藏:

Advance 部分旁邊有一個 Show 按鈕,用於展開,展開後可點擊 Hide 將其隱藏,以下圖所示:

5,內聯(Inline)顯示

上面的 Contact 是 Tag 的外部鍵,因此有外部參考的關係。

而在默認的頁面顯示中,將二者分離開來,沒法體現出二者的從屬關係。咱們可使用內聯顯示,讓 Tag 附加在 Contact 的編輯頁面上顯示。

修改tmode/admin.py:

from django.contrib import admin
from TestModel.models import Test,Contact,Tag
 
# Register your models here.
class TagInline(admin.TabularInline):
    model = Tag
 
class ContactAdmin(admin.ModelAdmin):
    inlines = [TagInline]  # Inline
    fieldsets = (
        ['Main',{
            'fields':('name','email'),
        }],
        ['Advance',{
            'classes': ('collapse',),
            'fields': ('age',),
        }]
 
    )
 
admin.site.register(Contact, ContactAdmin)
admin.site.register([Test])

顯示效果以下:

6,列表頁的顯示

在 Contact 輸入數條記錄後,Contact 的列表頁看起來以下:

咱們也能夠自定義該頁面的顯示,好比在列表中顯示更多的欄目,只須要在 ContactAdmin 中增長 list_display 屬性:

from django.contrib import admin
from TestModel.models import Test,Contact,Tag
 
# Register your models here.
class TagInline(admin.TabularInline):
    model = Tag
 
class ContactAdmin(admin.ModelAdmin):
    list_display = ('name','age', 'email') # list
    inlines = [TagInline]  # Inline
    fieldsets = (
        ['Main',{
            'fields':('name','email'),
        }],
        ['Advance',{
            'classes': ('collapse',),
            'fields': ('age',),
        }]
 
    )
 
admin.site.register(Contact, ContactAdmin)
admin.site.register([Test])

刷新頁面顯示效果以下:

搜索功能在管理大量記錄時很是有,咱們可使用 search_fields 爲該列表頁增長搜索欄:

from django.contrib import admin
from TestModel.models import Test,Contact,Tag
 
# Register your models here.
class TagInline(admin.TabularInline):
    model = Tag
 
class ContactAdmin(admin.ModelAdmin):
    list_display = ('name','age', 'email') # list展現列
    search_fields = ('name',) #增長搜索欄
    inlines = [TagInline]  # Inline
    fieldsets = (
        ['Main',{
            'fields':('name','email'),
        }],
        ['Advance',{
            'classes': ('collapse',),
            'fields': ('age',),
        }]
 
    )
 
admin.site.register(Contact, ContactAdmin)
admin.site.register([Test])

咱們搜索了 name 爲 baidu 的記錄,顯示結果以下:

Django Admin 管理工具還有很是多實用的功能,感興趣的能夠深刻研究。

相關文章
相關標籤/搜索