django---入門
MTV模型
Model(模型):對數據進行操作
Template(模板)
View(視圖):負責業務邏輯
django:
urls:路徑與視圖函數的映射關系
views:邏輯處理
models: 數據庫的相關操作
template:模板語法————————>將變量(數據庫中取出的數據)巧妙的嵌入到html頁面中
Django 學習
創建Django項目:
django-admin startproject mysite(projectname)
manage.py: 啟動文件,控制項目命令
mysite : 全局文件
添加應用:(一個項目中可以有多個應用)
python manage.py startapp 應用名
啟動django項目:
python manage.py runserver ip port
創建項目流程:
需求:當用戶輸入一個url:/timor 時返回一個對應的視圖操作
使用pycharm 創建一個django項目
1 urls:
給/timor路徑返回一個對應函數(我理解為路由功能)
格式為放在列表中的由url包裹的對應關系 url (r‘^admin/‘, admin.site.urls)
1 urlpatterns = patterns(‘視圖前綴‘, 2 url(r‘^正則表達式1/$‘, ‘視圖函數1‘, name="url標識1"), 3 url(r‘^正則表達式2/$‘, ‘視圖函數2‘, name="url標識2"), 4 )
本段來自於:Django中關於URL配置文件urls.py的理解
patterns函數的第一個參數表示視圖前綴,視圖前綴可以為空,之後跟上若幹個url函數,每個url函數表示一個請求映射關系。
註意:
1 url函數的第二個參數,表示視圖函數,它的名字不是隨便取的,必須要在views.py中真實存在,項目的每個應用下都會有一個views.py文件。
2 views.py文件中的視圖函數,其第一個參數必須是HttpRequest對象。
3 name的作用主要體現在一個視圖函數對應多個url請求的場景中,name可以用來唯一標識一個url,所以它必須全局唯一。
註:
- 若要從URL 中捕獲一個值,只需要在它周圍放置一對圓括號。
- 不需要添加一個前導的反斜杠,因為每個URL 都有。例如,應該是^articles 而不是 ^/articles。
- 每個正則表達式前面的‘r‘ 是可選的但是建議加上。它告訴Python 這個字符串是“原始的” —— 字符串中任何字符都不應該轉義。參見Dive Into Python 中的解釋。
一些請求的例子:
- /articles/2005/03/ 請求將匹配列表中的第三個模式。Django 將調用函數views.month_archive(request, ‘2005‘,‘03‘)。
- /articles/2005/3/ 不匹配任何URL 模式,因為列表中的第三個模式要求月份應該是兩個數字。
- /articles/2003/ 將匹配列表中的第一個模式不是第二個,因為模式按順序匹配,第一個會首先測試是否匹配。請像這樣自由插入一些特殊的情況來探測匹配的次序。
- /articles/2003 不匹配任何一個模式,因為每個模式要求URL 以一個斜線結尾。
- /articles/2003/03/03/ 將匹配最後一個模式。Django 將調用函數views.article_detail(request, ‘2003‘, ‘03‘,‘03‘)。
命名組?
上面的示例使用簡單的、沒有命名的正則表達式組(通過圓括號)來捕獲URL 中的值並以位置 參數傳遞給視圖。在更高級的用法中,可以使用命名的正則表達式組來捕獲URL 中的值並以關鍵字 參數傳遞給視圖。
在Python 正則表達式中,命名正則表達式組的語法是(?P<name>pattern),其中name 是組的名稱,pattern 是要匹配的模式。
下面是以上URLconf 使用命名組的重寫:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r‘^articles/2003/$‘, views.special_case_2003),
url(r‘^articles/(?P<year>[0-9]{4})/$‘, views.year_archive),
url(r‘^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$‘, views.month_archive),
url(r‘^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$‘, views.article_detail),
]
這個實現與前面的示例完全相同,只有一個細微的差別:捕獲的值作為關鍵字參數而不是位置參數傳遞給視圖函數。例如:
- /articles/2005/03/ 請求將調用views.month_archive(request, year=‘2005‘, month=‘03‘)函數,而不是views.month_archive(request, ‘2005‘, ‘03‘)。
- /articles/2003/03/03/ 請求將調用函數views.article_detail(request, year=‘2003‘, month=‘03‘,day=‘03‘)。
在實際應用中,這意味你的URLconf 會更加明晰且不容易產生參數順序問題的錯誤 —— 你可以在你的視圖函數定義中重新安排參數的順序。當然,這些好處是以簡潔為代價;conf
url分發:
當django項目中存在多個app時;URLconf中的urls做分發
匹配/分組算法?
下面是URLconf 解析器使用的算法,針對正則表達式中的命名組和非命名組:
- 如果有命名參數,則使用這些命名參數,忽略非命名參數。
- 否則,它將以位置參數傳遞所有的非命名參數。
- 這兩種情況下,多余的關鍵字參數也將傳遞給視圖。
指定視圖參數的默認值?
有一個方便的小技巧是指定視圖參數的默認值。 下面是一個URLconf 和視圖的示例:
# URLconf
from django.conf.urls import url
from . import views
urlpatterns = [
url(r‘^blog/$‘, views.page),
url(r‘^blog/page(?P<num>[0-9]+)/$‘, views.page),
]
# View (in blog/views.py)
def page(request, num="1"):
# Output the appropriate page of blog entries, according to num.
...
在上面的例子中,兩個URL模式指向同一個視圖views.page —— 但是第一個模式不會從URL 中捕獲任何值。如果第一個模式匹配,page() 函數將使用num參數的默認值"1"。如果第二個模式匹配,page() 將使用正則表達式捕獲的num 值。
--------------------
來自於django文檔
2 view.py 涉及數據讀取及模板渲染
1 from django.shortcuts import render,HttpResponse 2 import datetime 3 # Create your views here. 4 5 def timer(request):#request對應的是所有請求信息 6 #函數中返回使用render 7 # 若只想返回一個字符串只需使用HttpResponse 8 #必須返回一個響應對象(必須實現return方法) 9 t=datetime.datetime.now() 10 # return HttpResponse("OK")#HttpResponse 返回相應字符串 11 return render(request,‘timer.html‘,{‘timer‘:str(t)}) 12 #無需輸入路徑,在settings文件中已經定義好路徑 13 #render幫助處理網頁並且發送 14 #模板語法 15 #在網頁中將要被插入的字符的變量名name寫在 {{ name}} 16 #被插入的標簽名name寫在{%name}
17 #render做的事情就是將timer.html讀出來根據後面給出的字典去替換
(在視圖中有3種邏輯)
(1)使用HTTPResponse("str")返回一個字符串
(2)使用render(request,html,{dict})返回一個渲染後的html文件
(3)使用redirect(‘/get請求目錄/‘) 重新進入路由,url更新
反向解析:
使用模板語法url中的一條這麽寫 url(r‘index/‘,view.func,name=‘name‘)
html中這麽寫{%url ‘name‘%}
模板template
from django.template import Template,Context
模板對象 Template
對應關系Context
Templateobj.render(Contextobj)
返回 HTTPResponse(Templateobj.render(Contextobj))
locals()方法的使用
模板之基本語法
什麽是模板?
html+模板語法
變量相關
可以是類
{{name}} 視圖中傳入的變量
{{name.0}}可以使用索引使用句號符
句點符也可以用來引用對象的方法(無參數方法)
<h4>字典:{{ dic.name.upper }}<
/
h4>
循環切片{{name[2:-2]}}
模板
模板之過濾器
語法:
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}}
|
模板之標簽
一些標簽需要開始和結束標簽 (例如{% tag %} ...
標簽 內容 ... {% endtag %})。
for標簽
遍歷每一個元素:
{% for person in person_list %} <p>{{ person.name }}</p> {% endfor %}
可以利用{% for obj in list reversed %}反向完成循環。
遍歷一個字典:
{% for key,val in dic.items %} <p>{{ key }}:{{ val }}</p> {% endfor %}
註:循環序號可以通過{{forloop}}顯示
1 2 3 4 5 6 |
forloop.counter The current iteration of the loop ( 1 - indexed)
forloop.counter0 The current iteration of the loop ( 0 - indexed)
forloop.revcounter The number of iterations from the end of the loop ( 1 - indexed)
forloop.revcounter0 The number of iterations from the end of the loop ( 0 - indexed)
forloop.first True if this is the first time through the loop
forloop.last True if this is the last time through the loop
|
for ... empty
for 標簽帶有一個可選的{% empty %} 從句,以便在給出的組是空的或者沒有被找到時,可以有所操作。
{% for person in person_list %} <p>{{ person.name }}</p> {% empty %} <p>sorry,no person here</p> {% endfor %}
if 標簽
{% if %}會對一個變量求值,如果它的值是“True”(存在、不為空、且不是boolean類型的false值),對應的內容塊會輸出。
{% if num > 100 or num < 0 %} <p>無效</p> {% elif num > 80 and num < 100 %} <p>優秀</p> {% else %} <p>湊活吧</p> {% endif %}
with
使用一個簡單地名字緩存一個復雜的變量,當你需要使用一個“昂貴的”方法(比如訪問數據庫)很多次的時候是非常有用的
例如:
{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
csrf_token
這個標簽用於跨站請求偽造保護
自定義過濾器和標簽
步驟:
1 在settings中的INSTALLED_APPS,是否有當前應用
2 在應用中創建一個templatetags
3 在templatetags中創建py文件:mytag.py
4 在mytag.py中:
引入:
from django import template
from django.utils.safestring import mark_safe
register = template.Library() #register的名字是固定的,不可改變
5 定義過濾器和標簽
@register.filter
def multi(x,y):
return x*y
@register.simple_tag
def multiTag(x,y,z):
return x*y*z
6 在引用模板中導入:{% load myTag %}
7 調用:
過濾器: {{var|filter_name:參數}} # 參數只能是一個
標簽: {% simple_tag 參數1 參數2 ... %}
對比過濾器與自定義標簽的使用:
過濾器函數的參數只能有兩個,自定義標簽無參數限制
過濾器可以與邏輯標簽共同使用,比如if標簽。自定義標簽不可以。
django---入門