1. 程式人生 > >django---入門

django---入門

序列 遍歷 ans 產生 優秀 matching n) exp 所有

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 解析器使用的算法,針對正則表達式中的命名組和非命名組:

  1. 如果有命名參數,則使用這些命名參數,忽略非命名參數。
  2. 否則,它將以位置參數傳遞所有的非命名參數。
  3. 這兩種情況下,多余的關鍵字參數也將傳遞給視圖。

指定視圖參數的默認值?

有一個方便的小技巧是指定視圖參數的默認值。 下面是一個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}}
模板參數:http://python.usyiyi.cn/translate/django_182/ref/templates/builtins.html#ref-templates-builtins-tags
模板之標簽

一些標簽需要開始和結束標簽 (例如{% 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---入門