Django - 環境搭建、url、視圖、模板、標籤、過濾器

(一).簡介php

簡介就很少說了,網上的內容一大堆。總結來講,django是走大而全的路線,寫項目超級快,幾乎什麼都爲你考慮到了,你就乖乖照着它的格式來寫就好了。css

這裏來一些基本認知:html

web應用框架(web application framework)是一種開發框架,用來支持動態網站、網絡應用程序以及網絡服務的開發。python

http服務器:用來接受用戶的請求,並將請求轉發給web應用框架進行處理。web應用框架處理完之後再發送給http服務器,http服務器再返回給用戶。web

可是,項目真要作大了,django擴展方面的問題就來了。龐大就會致使臃腫,不易於擴展。不過,就目前學習階段而言,根本不用考慮這麼多。正則表達式

(二).使用哪一個版本?數據庫

學習和開發項目中,必定會使用穩定的版本,也就是LTS(long term support)django

目前學習用的是django1.11.7。因此說,在pip的時候要指定一下版本。即:pip install django==1.11.7編程

(三).注意點ubuntu

若是要使用django2.x版本進行項目,在一些版本較老的ubuntu server上可能會安裝不上。緣由多數是pip的版本太低。

那麼先進行pip升級,在Ubuntu中的命令:sudo pip3 install --upgrade pip

而後再pip安裝django模塊。

 

1、建立一個django項目

絕大部分的項目都是在Linux上跑的,因此,項目就要放在Linux中。

(一).準備好虛擬環境

進行項目做業的時候,每一個項目所須要的依賴包、環境變量,都有可能不同。你要是在Linux的全局環境中改這個改那個(要知道Linux中軟件之間的相互依賴關係是比較複雜的),要是一個不當心把全局環境搞崩了(你還不知道是何時怎麼把哪一個依賴給搞崩的),而後你修復起來也會感受很崩潰。

好比一個django項目是須要1.11的版本,另外一個django項目要2.0的版本。兩個項目要是同時開搞,難道你在全局環境中來回地pip install django==version_number?pip uninstall django?那麼,虛擬環境就完美地解決了這個問題。並且不少django核心開發者也推薦在虛擬環境中進行項目做業。

每一個虛擬環境都是獨立自主的,多個虛擬環境之間徹底是隔離開的、互不相關。

(1).建立虛擬環境

可參考下列步驟:

# 事先要安裝好python3.6.x
# 並將創好這兩個的軟鏈到 /usr/bin/

# 沒有pip3的話 先執行下面這條命令
sudo apt-get install python3-pip
# 而後必須更新
sudo pip3 install --upgrade pip

sudo pip3 install virtualenv

sudo pip3 install virtualenvwrapper  # 必需要裝

mkdir ~/.virtualenvs  # 建立文件夾

export WORKON_HOME=~/.virtualenvs

VIRTUALENVWRAPPER_PYTHON='/usr/bin/python3'

source /usr/local/bin/virtualenvwrapper.sh

source ~/.bashrc

cd .virtualenvs/  # 我本身想要在這個目錄下建虛擬環境,因此cd了

mkvirtualenv venv_djpy

virtualenv venv_djpy

試着workon看一下
View Code

(2).趕上workon: command not found怎麼辦?

# 須要編輯這個配置文件
vim ~/.bashrc

# 把下面三行代碼放進這個配置文件中
export WORKON_HOME=~/.virtualenvs
VIRTUALENVWRAPPER_PYTHON='/usr/bin/python3'
source /usr/local/bin/virtualenvwrapper.sh
# 保存並退出 (Esc -> : -> wq -> 回車)

# 重啓配置
source ~/.bashrc
View Code

(二).使用命令行的方式建立一個django項目(通用操做,必須得學會)

(1).進入一個python3的虛擬環境。

(2).cd到你放項目的文件夾中。

(3).輸入命令:django-admin startproject 項目的名字。

(4).在本地環境中,建好一個空文件夾,用於等會代碼同步時從虛擬機中下載來的代碼有地方能夠放。

(5).pycharm進行代碼同步設置,而後從Linux上把代碼下載到本地。

注意:代碼同步建議用"Ctrl+s"這個選項。(Always)自動上傳代碼,有很小的概率會使Linux系統崩潰。

(三).使用pycharm的方式(目前本人使用的pycharm版本)

(四).何爲app

一個項目由有許許多多的模塊構成,這些模塊能夠理解成app

(五).建立一個新的app

建完了項目,就能夠在項目中新建app了。

(1).cd到"manage.py"這個文件所在的目錄

(2).敲命令:python manage.py startapp <app_name>

(3)."應用程序"對應於"application","應用"對應於"app"。在通常的Web開發中,這兩者幾乎沒什麼區別。可是在Django中,兩者有一個明顯的區別:application是指一個完整的Web程序,而app是指一個可複用的包,能夠「插入」其餘Django應用程序中。

(六).註冊app

新建一個app以後,必需要把它的名字註冊到"settings.py"的"INSTALLED_APPS"中,否則這個app下面的子路由、模板、自定義過濾器等等,系統都找不到!

 

(七).修改時區

django1.11.7中,使用的時區是"UTC",也就是"世界標準時間"。目前國際通信系統,如衛星、航空、GPS等等,都採用UTC時間。但其時區上,與GTM一致。

我國在時區上屬於東八區,也就是GTM+8.

想要獲取到本地的時間,就須要在"settings.py"中修改"TIME_ZONE"這個屬性。TIME_ZONE = "UTC" 改爲 TIME_ZONE = "Asia/Shanghai"

 

2、Django目錄簡介

外層的tk_dj/根目錄是項目的容器。這個目錄的名稱對Django沒有什麼做用,你能夠根據喜愛重命名。

manage.py:管理django項目的工具,一個命令行工具。

__inti__.py:告訴解釋器,這個目錄是python包。

settings.py:配置文件。包含數據庫信息,調試標識,靜態文件等。

urls.py:django項目總url聲明(總路由)。

wsgi.py:部署項目會用到。

 

3、開啓服務器

別忘了開啓服務!不然連你本身都訪問不到網站。PS:我就犯過這SB錯誤,寫完代碼,直接去瀏覽器刷新了,刷來刷去沒有頁面。一看,服務沒開啓來 [/笑哭]~

(一).第一步(重中之重)

打開settings.py,把ALLOWED_HOSTS = [] 改爲 ALLOWED_HOSTS = ["*"]

 

項目是部署在Linux上的,只有這樣寫纔可讓windows上的瀏覽器訪問到Linux服務器上的項目。

(二).Linux上的操做步驟

(1).在Linux中,進入"manage.py"這個文件所在的目錄。

(2).輸入代碼:python manage.py runserver 0:8000

其中,0是"0.0.0.0"的縮寫,容許全部的IP都可以訪問。而後,後面加冒號,再跟上端口號。

(3).去瀏覽器的地址欄中,敲入"IP:端口",就能夠訪問了。

注意:若是你的虛擬機是VMware,那麼幾乎不須要端口轉發,在瀏覽器的地址欄中直接鍵入完整的IP。

我用的是VMware,不知道端口轉發該怎麼搞 [/糗]

(三).pycharm中的操做步驟

 

(四).端口被佔用

(1).若是在pycharm中看到開了兩個,直接關掉其中一個。

(2).看不到的話,去Linux中殺進程。

先敲入:ps -aux | grep manage 看到有哪些進程。

而後通通殺之:kill -s 9 進程ID

 

4、最基本的視圖函數和路由設置

(一).編寫視圖函數

# hello_django/views.py
from django.http import HttpResponse

def index(request):
    return HttpResponse('hello django!')
View Code

(二).設置路由

# hello_django/urls.py
from django.conf.urls import url
from django.contrib import admin
from . import views

urlpatterns = [
    url(r'^admin/$', admin.site.urls),
    url(r'^hello/$', views.index),
]
View Code

備註。脫字符:"^",是以什麼開頭。美圓符:"$",是以什麼結束。

 

5、urls.py路由用法

(一).URL概念

URL(uniform resource locator)統一資源定位符。說白了,就是網址!

(二).URL格式

例如:https://www.google.com/

(1).格式:schema://host[:port#]/path/.../[?query-string][#anchor]

(2).schema:指定使用的協議(例如:http://,https://,ftp://)

(3).host:http服務器的IP地址或者域名

(4).port:端口號,http默認是80端口

(5).path:訪問資源的路徑

(6).query-string:發送給http服務器的數據

(7).anchor:錨點

(三).urls.py的做用

本質上就是視圖函數的映射列表。告訴django,哪一個url調用哪段代碼。

(四).url解析過程

(1).django傳給url路由要處理的地址,該地址是被去掉端口號以後的第一個"/"的剩餘部分。

例如:http://127.0.0.1:8000/hello/

經處理後的剩餘部分就是:hello/

(2).django會拿着這個剩餘部分的地址,在urlpatterns這個列表裏,從上往下,依次進行正則匹配。

(3).django將會去調用第一個匹配到的視圖。

(五).url示例:

# hello_django/urls.py:
from django.conf.urls import include,url
from django.contrib import admin
from books import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^hello/python/$', views.hello_python),
    url(r'^hello/php/$', views.hello_php),
    url(r'^hello/([a-z]+)/$',views.hello_course),
    url(r'^add/(\d+)/(\d+)/$', views.add),
    url(r'^hello/(?P<name>\w+)/(?P<num>\d+)$',views.hello_django),
]
View Code
# books/views.py
from django.http import HttpResponse

def hello_python(request):
    return HttpResponse('Hello python!')

def hello_php(request):
    return HttpResponse('Hello php!')

def hello_course(request, course):
    return HttpResponse('Hello %s' % course)

def add(request,a,b):
    c = int(a)+int(b)
    return HttpResponse(str(c))

def hello_django(request, name, num):
    return HttpResponse('Hello %s %s' % (name, num))
View Code

(1).位置參數:示例中的 r"^hello/([a-z]+)/$" 以及 r"^hello/(\d+)/(\d+)/$"

在url函數中,正則表達式使用括號"()"進行捕獲參數。

(2).關鍵字參數:示例中的 r"^hello/(?P<name>\w+)/(?P<num>\d+)/$"

在url函數中,正則表達式使用(?P<keyword>)進行捕獲參數。

注意:keyword的命名,必須與它視圖函數中的參數名同樣,否則就會報錯!參數個數要同樣,名字也要同樣!

(3).其餘注意點:

參數類型是字符串類型,因此若是在視圖中要進行數值運算,須要強轉一下。

 

6、include

(一).做用

方便管理項目。一個項目有一個總urls.py,每一個app中,也建議須要有它本身的urls.py(能夠稱呼「子url」)。只是須要在總urls.py中,使用include()函數進行註冊。

若是一股腦,把全部app的url都放進總urls.py中。先別說app多了,視圖一多,就容易搞混了。

(二).示例

#hello_django/urls.py     主url文件
from django.conf.urls import include,url
from django.contrib import admin
from .import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^books/',include('books.urls')),
]
View Code
#books/urls.py    APP books裏面的URL文件
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$',views.index),
    url(r'article/$', views.article),
]
View Code
#book/view.py           APP books裏面的view文件
from django.http import HttpResponse

def index(request):
    return HttpResponse('這是首頁')

def article(request,):
    return HttpResponse('這是文章的首頁')
View Code

(三).注意事項

(1).總urls.py中,開頭不要加斜槓"/"。由於django已經給域名後面加了一個斜槓,你要是開頭也加個斜槓,url一拼接,就匹配不到了。直接404

(2).總urls.py中,結尾不要加美圓符"$"。美圓符的意義是:以什麼結束。總url都結束了,那麼子url中的urlpatterns還匹配個球呢

(3).總urls.py中,結尾要加斜槓"/"。

(4).子urls.py中,開頭不要加斜槓"/"。同理於(1).

(5).子urls.py中,結尾能夠接美圓符"$"。

 

7、kwargs的做用

django.conf.urls.url()函數能夠接收第三個可選參數,它必須是一個字典,表示想要傳遞給視圖函數的額外關鍵字參數。

(一) .示例

#hello_django/urls.py     主url文件
from django.conf.urls import include,url
from django.contrib import admin
from .import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^books/',include('books.urls'),{'switch':'true'}),
]
View Code
# book/view.py      APP books裏面的view文件
from django.http import HttpResponse
import datetime

def index(request,**kwargs):
    if kwargs.get('switch') == 'true':
        print(datetime.datetime.now())
    return HttpResponse('<h1>這是首頁</h1>')
View Code

此示例中,kwargs起到了「開關的做用」:當switch爲"true"這個值,在控制檯打印時間(要顯示本地時間須要去setting.py中設置下TIME_ZONE這個屬性)。當switch不爲"true"這個值,就不會打印出時間。

 

8、name的做用

name參數能夠給url取一個名字。經過給url取名字,之後在這個views或者模版中使用這個url,就只須要經過這個名字就能夠了。

通常用於模版。也可使用reverse進行頁面重定向。

(一).示例

# book/url.py    APP books裏面的URL文件
from django.conf.urls import url
from . import views

urlpatterns =[
    url(r'^$',views.index),
    url(r'article/$', views.article,name='books_article'),
    url(r'^(?P<books>\w+)/$',views.book_list,name='books_lists'),
    url(r'^article_new/$', views.article_new,name='books_article_new'),
]
View Code
# book/views.py   APP book裏面的view文件
from django.shortcuts import render,reverse,redirect
from django.http import HttpResponse
# Create your views here.

def article(request,**kwargs):
    if kwargs.get('switch') == 'true':
        return redirect(reverse('book_article_new'))
    return HttpResponse('這是文章首頁')

def article_new(request,**kwargs):
    return HttpResponse('這是新的文章首頁')
View Code

9、模板渲染方式

Django模板是一些文本字符串,做用是把文檔的表現與數據區分開。模板定義一些佔位符和基本的邏輯(模板標籤),規定如何顯示文檔。一般,模板用於生成HTML

(一).setting.py中模版路徑配置

用命令行建項目,沒有"templates"這個文件夾。而這個文件夾是用來存放html頁面的。

既然沒有,那麼就本身手動在項目的根目錄中建立一個名爲"templates"的文件夾(名字切記不要打錯了)。

而後打開"settings.py",把TEMPLATES中的 'DIRS':[] 改爲 'DIRS':[os.path.join(BASE_DIR, "templates")]

(二).在"templates"中,新建html文件

在"templates"中,新建一個與app同名的文件夾,再在其裏面新建html文件。這樣作的好處是,本身不會搞混。頁面多了,若是不歸類,立刻就會把本身搞暈了。

(三).使用render()進行渲染

# books/views.py
from django.shortcuts import render

def index_3(request):
    return render(request,'index.html')
View Code

注意:render()函數中的第一個參數,必須是request這個請求對象。

(四).去urls.py中進行路由註冊

 

10、模板變量

(一)語法

兩對花括號包圍的文本,{{variable_name}} 意思是:把指定變量的值插入這裏

Ps:變量名的命名規則與python同樣。

(二).切換模板語言

這樣設置後,只須要寫一個關鍵字,而後按tab鍵,pycharm就會自動幫你補全,省心了不少不少。

(三).示例

{# /templates/books/index.html #}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首頁</title>
</head>
<body>
    這個變量是字符串對象:{{ books_name}}<br>
    這個變量是函數對象:{{ hello}}<br>
    這個變量是類方法對象:{{ fruits_say}}<br>
    這個變量是類對象:{{ fruits}}<br>
    這個變量是類對象,訪問類對象的屬性:{{ fruits.name}}<br>
    這個變量是類對象,訪問類對象的方法:{{ fruits.say}}<br>
    這個變量是列表對象{{ list }}<br>
    這個變量是列表對象,訪問列表的元素{{ list.1 }}<br>
    這個變量是字典對象{{ dict }}<br>
    這個變量是字典對象,訪問字典的鍵{{ dict.a }}<br>
</body>
</html>
View Code
# books/views.py
from django.shortcuts import render


def hello():
    return 'django'


class Fruits:
    def __init__(self, name, color):
        self.name = name
        self.color = color

    def say(self):
        return 'HAHAHAHA'


ap = Fruits('apple', 'red')
ls = ['x', 'y', 'z']
dc = {'a': 1, 'b': 2}


def index_5(request):
    return render(
        request,
        'books/index.html',
        context={'books_name': 'python',  # 字符串
                 'hello': hello,  # 函數
                 'fruits_say': ap.say,  # 方法
                 'fruits': ap,  # 類對象
                 'list': ls,  # 列表
                 'dict': dc,  # 字典
                 }
    )
View Code

(四).變量和查找

點"."在模板中表示查找。模板看見這個點".",它會按:字典查找、屬性查找、列表索引的進行查找。

(五).不要與python或django關鍵字重名

好比,你來了一個變量:{{data}} 這個變量是一個字典。那麼訪問data.itmes的時候,將會去訪問這個變量中,名爲"items"的鍵。而不是訪問python字典中的items()方法。

 

11、模板過濾器

(一).語法

例:{{fruits|lower}}

管道符"|"進行鏈式調用,去實現某個功能。

此例中,把fruits對應的字符串,所有轉成小寫。

(二).做用

對變量進行過濾,把處理後的結果展現出來。就像上例,把字符串所有轉成了小寫。

(三).過濾器可使用參數

在過濾器的名稱後面跟上冒號":"再加參數。好比,要把一個字符串中全部的空格去掉,則可使用"cut"過濾器。

{{fruits|cut:' '}}

注意:冒號和參數之間不能有任何空格,必定要緊挨着!

(四).經常使用的過濾器

1、add :字符串相加,數字相加,列表相加,若是失敗,將會返回一個空字符串。
2、default:提供一個默認值,在這個值被django認爲是False的時候使用。好比:空字符串、None。區別於default_if_none,這個只有在變量爲None的時候才使用默認值。
3、first:返回列表中的第一個值。
4、last:返回列表中的最後一個值。
5、date:格式化日期和時間。
6、time:格式化時間。
7、join:跟python中的join同樣的用法。
8、length:返回字符串或者是數組的長度。
9、length_is:字符串或者是數組的長度是不是指定的值。
10、lower:把全部字符串都編程小寫。
11、truncatechars:根據後面給的參數,截斷字符,若是超過了用…表示。
12、truncatewords:同truncatechars,這個是以一個單詞爲單位進行截斷。
以上兩個有xxx_html類型的,針對html,截斷標籤中的字符,而不會截斷標籤。
13、capfirst:首字母大寫。
14、slice:切割列表。用法跟python中的切片操做是同樣的,區間是前閉合後開放。
15、striptags:去掉全部的html標籤。
16、safe:關閉變量的自動轉義
1七、floatformat:浮點數格式化。
View Code

(五).date和time過濾格式

Y:四位數的年。如:1999
y:兩位數的年。如:99
m:兩位數的月。如:01,09
n:一位數的月。如:1,9,12
d:兩位數的日。如:01,09,31
j:一位數的日。如:1,9,31
g:12小時制的一位數的小時。如:1,9,12
G:24小時制的一位數小時。如:0,8,23
h:12小時制的兩位數的小時。如:01,09,12
H:24小時制的兩位數的小時。如:01,13,24
i:分鐘。從00-59
s:秒。從00-59
View Code

(六).示例

{# /templates/movie/index22.html #}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>home</title>
</head>
<body>
    這是沒作處理的變量:{{ test }}<br>
    這是設置了默認值的變量:{{ xx|default:'xxxxxx' }}<br>
    這是設置了只有爲None時才使用默認值的變量:{{ xx|default_if_none:'xxxxxx' }}<br>
    這是變爲小寫後的變量:{{ test|lower }}<br>
    這是先變成小寫再將首字母大寫後的變量:{{ test|lower|capfirst}}<br>
    這是兩個數字變量相加:{{ num1|add:num2 }}<br>
    這是兩個字符串變量相加:{{ test|add:xx }}<br>
    這是列表變量的第一個元素:{{ list|first }}<br>
    這是列表變量的最後一個元素:{{ list|last }}<br>
    這是默認的data日期時間格式:{{ now|date }}<br>
    這是默認的time時間格式:{{ now|time }}<br>
    這是data過濾器的年月日24小時制時間格式:{{ now|date:'Y/m/d/H:i:s ' }}<br>
    這是time過濾器的年月日12小時制時間格式:{{ now|time:'h:i:s ' }}<br>
    這是字符串的join方法:{{ ls|join:'xxx' }}<br>
    這是字符串的長度方法:{{ test|length }}<br>
    這是列表的長度是否長度爲4:{{ list|length_is:4 }}<br>
    這是字符串只顯示4個字符,其他省略(佔3位):{{ test|truncatechars:7 }}<br>
    這是字符串只顯示2個單詞,其他省略(不佔位):{{ test|truncatewords:2 }}<br>
    這是字符串切片:{{ test|slice:'1:4' }}<br>
    這是列表切片:{{ list|slice:':2' }}<br>
    這是含html標籤的字符串:{{ html }}<br>
    這是去掉字符串中的html標籤:{{ html|striptags }}<br>
    這是關掉自動轉義,使字符串中html標籤生效:{{ html|safe }}<br>
    這是沒作處理的小數:{{ float }}<br>
    這是保留了一位小數:{{ float|floatformat }}<br>
    這是保留了兩位位小數:{{ float|floatformat:'2' }}<br>  
</body>
</html>
View Code
# movie/views.py
from django.shortcuts import render
from datetime import datetime

ls = ['x', 'y', 'z']


def hello(request):
    test = 'THIS IS A LIST!'
    return render(
        request,
        'movie/home.html',
        context={'test': test,
                 'xx': '',
                 'num1': 1,
                 'num2': 2,
                 'list': ls,
                 'now': datetime.now,
                 'html': '<h1>hello django!!!</h1>',
                 'float': 3.1415926,
                 }
    )
View Code

12、模板標籤

(一).語法

一對花括號和百分號包圍的文本,{% if xxx %})是模板標籤。標籤的定義至關寬泛:只要能讓模板系統「作些事」的就是標籤。

實際敲代碼的時候,就是在html頁面上寫python代碼(語法很是接近python)。一個標籤能夠輸出內容,做爲控制、循環結構,甚至能夠訪問其餘的模板標籤。

注意事項:標籤要記得關閉!如:{%tag%}{%endtag%} Ps:就像大多數的html代碼那樣,要關閉標籤!

(一).經常使用標籤

(1)if/elif/else:可使用and/or/in/not/==/!=/<=/>=,來進行判斷。ifequal/ifnotequal
(2)forin…:跟python中的for…in…是同樣的用法。
forloop.counter:當前迭代的次數,下標從1開始。
forloop.counter0:當前迭代的次數,下標從0開始。
forloop.revcounter:跟forloop.counter同樣,下標從大到小。
forloop.revcounter0:跟forloop.counter0同樣,下標從大到小。
forloop.first:返回bool類型,若是是第一次迭代,返回true,不然返回false。
forloop.last:返回bool類型,若是是最後一次迭代,返回True,不然返回False。
forloop.parentloop:若是發生多層for循環嵌套,那麼這個變量返回的是上一層的for
(3)forin…empty…:若是沒有數據,跳轉到empty中。
(4)load:加載第三方標籤。最經常使用的是{%load static%}
(5)url:返回一個命名了的URL的絕對路徑。
(6)with:緩存一個變量。
(7)autoescape:開啓和關閉自動轉義。
View Code

(二).示例

# views.py
from django.shortcuts import render


def index33(request, name):
    return render(
        request,
        'book/index33.html',
        context={'test_name': name,
                 'list': ls,
                 'dict': dc,
                 'html': '<h1>hello django</h1>',
                 }
    )
View Code
{# book/index33.html #}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>hello</title>
</head>
<body>
    {% if name == "python" %}
        這是python頁面哈哈哈
    {% elif name == "django"%}
        這是django的頁面嘿嘿嘿
    {% else %}
        呵呵呵 是{{ name }}的呢....
    {% endif %}
</body>
</html>
View Code
# for的使用
{% for i in list %}
    {% if forloop.counter0 == 0 %}
        <li>這是一個值:{{ i }}</li>
    {% else %}
           <li>{{ i }}</li>
    {% endif %}
{% endfor %}
View Code
# url 頁面轉換

# --------------url.py--------------
urlpatterns = [
    url(r'^test/$',views.test,name='test'),
    url(r'^index/([a-z]+)/$',views.index33),
    url(r'^new/(?P<aaa>\w+)/$',views.new,name='book_new'),
]

# --------------hello.html--------------
<a href="/book/test">test測試</a> <br>
<a href={% url 'test_alias' %}> test 頁面</a>
<a href="{% url 'book_new' 'django' %}">new傳參數</a>  <br>

# --------------views.py--------------
def test(request):
    return HttpResponse('test page!!!!!!!')
def new(request,aaa):
    return HttpResponse('這是新的頁面')
View Code
# with的使用
{% with test_name as tn  %}
    11111{{ tn }} <br>
    22222 {{ tn }} <br>
{% endwith %}
View Code
# autoescape的使用
原始的: {{ html }} <br>
過濾器方式: {{ html |safe }} <br>
標籤方式:
{% autoescape off %}
    {{ html }} <br>
{% endautoescape %}
View Code

十3、模板繼承與引用

模板繼承可讓你建立一個基本的架構

(一).示例

{# templates/music/base.html#}   
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}這是默認標題{% endblock %}</title>
</head>
<body>
{% block content %}
    這是默認內容
{% endblock %}
<br>
{% block demo %}
    這是默認演示
{% endblock %}
</body>
</html>
View Code
{# templates/music/ss.html#}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>內容</title>
</head>
<body>
Python學院 web開發django班
</body>
</html>
View Code
{# templates/music/index.html #}
{% extends 'music/base.html' %}
{% block title %}music主頁{% endblock %}
{% block content %}
    這句是經過block.super繼承父類的:{{ block.super }}<br>
    這是子模板本身的內容:沒有寫block就不會顯示
{% endblock %}
{% block demo %}
    這是經過include引用的其餘模板的內容:{% include 'music/ss.html' %}
{% endblock %}
View Code

二).引用

include標籤能夠包含一個html模板到當前模板中,include標籤是把html模板在此處展開。

(三).注意點

(1).{%extends%}標籤必須在模板的第一行。(放在<!DOCUMENT type>上面一行)

(2).子模板中的全部內容,必須出如今父模板定義好的{%block%}標籤中,不然django不會渲染。

(3).若是在某個block中要使用父模板的內容,使用block.super獲取。(能夠理解成:super().__init__())

 

十4、模板加載靜態文件

(一).在"settings.py"中添加"STATICFILES_DIRS",設置靜態文件目錄的路徑。(同理於templates)

(二).示例

# /static/js/myjs.js
alert('hahahaha');

# --------------------------------

# /static/css/mystyle.css
body{
    background: skyblue;
}
#---------------------------------

# /static/image/myimage.jpg
##存入圖片
View Code
{# /templates/index.html#}
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>靜態文件加載</title>
</head>
<body>
<link rel="stylesheet" href="{% static 'css/mystyle.css' %}">
<script src="{% static 'js/myjs.js' %}"></script>
圖片:
<img src="{% static 'img/myimage.jpg' %}" alt="">
</body>
</html>
View Code

十5、自定義過濾器

django已經提供了不少的內置過濾器,不過總有不夠用的時候,那麼就須要你本身定來定義過濾器。

自定義過濾器就是本身編寫帶有參數的python函數。

(一).建一個存放自定義過濾器的python包(實則就是一個文件夾)

這個python包的命名必須是"templatetags",小寫且一個字都不能改。

目錄結構以下圖:

"__init__.py"表示這是一個python包,能夠用來引入,必需要有"__init__.py"這個名字的py文件。

過濾器實則就是一個py文件,在模板中的引入語法:{% load myself_filters %}

(二).實例化註冊類

全部的自定義過濾器、自定義標籤,都必須在這個自定義的py文件中進行註冊。這樣才能在django模板中能夠被使用。

# templatetags/myself_filters.py

from django import template

register = template.Library()
View Code

(三).示例

def mycut(value, arg):
    """字符替換的自定義過濾器"""
    return value.replace(arg, '')
View Code
{# 在模板頁面上的使用 #}
{{ somevariable|mycut:"0" }}
View Code
# 註冊自定義過濾器
@register.filter(name='mycut')  # 不指定name,函數名就是過濾器的名字
def mycut(value, arg):
    return value.replace(arg, '')
View Code

補充:

(一).遇到須要django支持的時候

相關文章
相關標籤/搜索