Django框架中的視圖和模板
視圖views
django中的視圖就是用來定義函數來處理一些邏輯的核心地方。
django中通過urls來建立路徑跟views中的視圖函數的映射關系。
urls中的映射關系
‘‘‘ urlpatterns = [ url(正則表達式, views視圖函數,參數,別名), ] 參數說明: 一個正則表達式字符串 一個可調用對象,通常為一個視圖函數或一個指定視圖函數路徑的字符串 可選的要傳遞給視圖函數的默認參數(字典形式) 一個可選的name參數 ‘‘‘ 註意: 1 一旦匹配成功則不再繼續 2 若要從URL 中捕獲一個值,只需要在它周圍放置一對圓括號。3 不需要添加一個前導的反斜杠,因為每個URL 都有。例如,應該是^articles 而不是 ^/articles。 4 每個正則表達式前面的‘r‘ 是可選的但是建議加上。
分組
正則表達式還可以進行分組,加括號進行分組,分組之後就會把分組的內容當做參數傳給對應的視圖函數。
無名分組就是(位置傳參)。
有名分組就是(關鍵字傳參)。
視圖函數
下面是一個返回當前日期和時間作為HTML文檔的視圖:
from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
讓我們逐行閱讀上面的代碼:
-
首先,我們從 django.http模塊導入了HttpResponse類,以及Python的datetime庫。
-
接著,我們定義了current_datetime函數。它就是視圖函數。每個視圖函數都使用HttpRequest對象作為第一個參數,並且通常稱之為request。
註意,視圖函數的名稱並不重要;不需要用一個統一的命名方式來命名,以便讓Django識別它。我們將其命名為current_datetime,是因為這個名稱能夠精確地反映出它的功能。
-
這個視圖會返回一個HttpResponse對象,其中包含生成的響應。每個視圖函數都負責返回一個HttpResponse
request參數的屬性及方法:
‘‘‘ path: 請求頁面的全路徑,不包括域名 method: 請求中使用的HTTP方法的字符串表示。全大寫表示。例如 if req.method=="GET": do_something() elif req.method=="POST": do_something_else() GET: 包含所有HTTP GET參數的類字典對象 POST: 包含所有HTTP POST參數的類字典對象 COOKIES: 包含所有cookies的標準Python字典對象;keys和values都是字符串。 FILES: 包含所有上傳文件的類字典對象;FILES中的每一個Key都是<input type="file" name="" />標簽中 name屬性的值,FILES中的每一個value同時也是一個標準的python字典對象,包含下面三個Keys: filename: 上傳文件名,用字符串表示 content_type: 上傳文件的Content Type content: 上傳文件的原始內容 user: 是一個django.contrib.auth.models.User對象,代表當前登陸的用戶。如果訪問用戶當前 沒有登陸,user將被初始化為django.contrib.auth.models.AnonymousUser的實例。你 可以通過user的is_authenticated()方法來辨別用戶是否登陸: if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware 時該屬性才可用 session: 唯一可讀寫的屬性,代表當前會話的字典對象;自己有激活Django中的session支持時該屬性才可用。 ‘‘‘ 方法: 1 get_full_path() 註意:鍵值對的值是多個的時候,比如checkbox類型的input標簽,select標簽,需要用: 1 request.POST.getlist("hobby")
render函數:
render(request, template_name[, context])
結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的 HttpResponse 對象。
參數:
request: 用於生成響應的請求對象。
template_name:要使用的模板的完整名稱,可選的參數
context:添加到模板上下文的一個字典。默認是一個空字典。如果字典中的某個值是可調用的,視圖將在渲染模板之前調用它。
content_type:生成的文檔要使用的MIME類型。默認為DEFAULT_CONTENT_TYPE 設置的值。
status:響應的狀態碼。默認為200。
redirect函數:
參數可以是:
- 一個模型:將調用模型的get_absolute_url() 函數
- 一個視圖,可以帶有參數:將使用urlresolvers.reverse 來反向解析名稱
- 一個絕對的或相對的URL,將原封不動的作為重定向的位置。
默認返回一個臨時的重定向;傳遞permanent=True 可以返回一個永久的重定向。
示例:
你可以用多種方式使用redirect() 函數。
傳遞一個對象
將調用get_absolute_url() 方法來獲取重定向的URL:
1 2 3 4 5 6 |
from django.shortcuts import redirect
def my_view(request):
...
object = MyModel.objects.get(...)
return redirect( object )
|
傳遞一個視圖的名稱
可以帶有位置參數和關鍵字參數;將使用reverse() 方法反向解析URL:
1 2 3 |
def my_view(request):
...
return redirect( ‘some-view-name‘ , foo = ‘bar‘ )
|
傳遞要重定向的一個硬編碼的URL
1 2 3 |
def my_view(request):
...
return redirect( ‘/some/url/‘ )
|
也可以是一個完整的URL:
1 2 3 |
def my_view(request):
...
return redirect( ‘http://example.com/‘ )
|
默認情況下,redirect() 返回一個臨時重定向。以上所有的形式都接收一個permanent 參數;如果設置為True,將返回一個永久的重定向:
1 2 3 4 |
def my_view(request):
...
object = MyModel.objects.get(...)
return redirect( object , permanent = True )
|
模板層(template)
模板就是html代碼加模板語法
模板語法有兩種: { { } } 跟 { % % }
在 Django 模板中遍歷復雜數據結構的關鍵是句點字符 .
語法:
1 |
{{var_name}}
|
views:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def index(request):
import datetime
s = "hello"
l = [ 111 , 222 , 333 ] # 列表
dic = { "name" : "yuan" , "age" : 18 } # 字典
date = datetime.date( 1993 , 5 , 2 ) # 日期對象
class Person( object ):
def __init__( self ,name):
self .name = name
person_w = Person( "www" ) # 自定義類對象
person_x = Person( "xxx" )
person_p = Person( "ppp" )
person_list = [person_w,person_x,person_p]
return render(request, "index.html" ,{ "l" :l, "dic" :dic, "date" :date, "person_list" :person_list})
|
template:
1 2 3 4 5 6 |
<h4>{{s}}< / h4>
<h4>列表:{{ l. 0 }}< / h4>
<h4>列表:{{ l. 2 }}< / h4>
<h4>字典:{{ dic.name }}< / h4>
<h4>日期:{{ date.year }}< / h4>
<h4>類對象列表:{{ person_list. 0.name }}< / h4>
|
註意:句點符也可以用來引用對象的方法(無參數方法)。
1 |
<h4>字典:{{ dic.name.upper }}< / h4>
|
模板之過濾器
語法:
1 |
{{obj|filter__name:param}}
|
default
如果一個變量是false或者為空,使用給定的默認值。否則,使用變量的值。例如:
1 |
{{ value|default: "nothing" }}
|
length
返回值的長度。它對字符串和列表都起作用。例如:
1 |
{{ value|length }}
|
如果 value 是 [‘a‘, ‘b‘, ‘c‘, ‘d‘],那麽輸出是 4。
filesizeformat
將值格式化為一個 “人類可讀的” 文件尺寸 (例如 ‘13 KB‘
, ‘4.1 MB‘
, ‘102 bytes‘
, 等等)。例如:
1 |
{{ value|filesizeformat }}
|
如果 value
是 123456789,輸出將會是 117.7 MB
。
date
如果 value=datetime.datetime.now()
1 |
{{ value|date: "Y-m-d" }}
|
slice
如果 value="hello world"
1 |
{{ value| slice : "2:-1" }}
|
truncatechars
如果字符串字符多於指定的字符數量,那麽會被截斷。截斷的字符串將以可翻譯的省略號序列(“...”)結尾。
參數:要截斷的字符數
例如:
1 |
{{ value|truncatechars: 9 }}
|
如果value是“Joel 是 a >,輸出將為“Joel i ...”。
safe
Django的模板中會對HTML標簽和JS等語法標簽進行自動轉義,原因顯而易見,這樣是為了安全。但是有的時候我們可能不希望這些HTML元素被轉義,比如我們做一個內容管理系統,後臺添加的文章中是經過修飾的,這些修飾可能是通過一個類似於FCKeditor編輯加註了HTML修飾符的文本,如果自動轉義的話顯示的就是保護HTML標簽的源文件。為了在Django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變量我們可以通過過濾器“|safe”的方式告訴Django這段代碼是安全的不必轉義。比如:
1 |
value = "<a href=" ">點擊</a>"
|
1 |
{{ value|safe}}
|
這裏簡單介紹一些常用的模板的過濾器,