一.須要弄清楚的幾個關鍵點:
KEY:
1 Django項目不管多大,只是一個應用程序
2 地址欄發請求默認是GET請求
form表單能夠發送get請求,也能夠發送post請求
3 瀏覽器接受的響應體是字符串,由瀏覽器解釋渲染成頁面給用戶看
4 form表單的提交按鈕事件:
給action對應的服務器發送請求
''
GET /auth/?數據user=yuan&pwd=123 ....
......
......
空行
請求體 # user=yuan&pwd=123
''
5 新的響應會覆蓋以前請求的響應頁面
二.Django路由
響應體:render 和 redirect 都基於HttpResponse
1.HttpResponse
HttpResponse("字符串") 或 HttpResponse("<a>click</a>")
2.render
goods_list = ["手機","電腦"]
dic ={"name":alex,"age":12}
視圖函數中格式
return render(request,"index.html",{"goods":goods_list,"dic":dic})
return render(request,local()),local()表示:拿到當前視圖函數中的變量
html文件中: {{goods}}
key:
1.找文件,讀文件
2.渲染數據,解析
3.把最終渲染的字符串交給HttpResponse返回
3.redirect (重定向)
訪問一個網站跳到另外一個網址; 場景:通常在登陸成功以後跳轉到首頁
1.重定向,涉及到兩份請求
2.須要到項目中的配置文件settings文件中,註釋掉,或在for表單中加上一句:{% csrf_token %}
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware', #setthings中註釋掉這句話
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
3.views視圖函數中,重定向的格式
重定向,發生了兩次請求。第一次,用戶驗證成功後,(登陸成功才重定向)
服務器給瀏覽器回一個狀態碼(302)和一個響應頭location:path(從定向路徑),
讓瀏覽器在次發請求去訪問redirect中的地址path
return redirect("/index/")
4.redirect
1.爲何用戶登陸成功後,不直接用render(request,"index.html"),直接訪問首頁,而是經過重定向,讓客戶再次發請求訪問首頁。
二者的區別直接用render(request,"index.html"),會丟失數據,就是沒有傳參數3數據部分;如何重定向去首頁,走的是
render(request,"index.html",{"goods":goods,.....}) 因此二者是有很大的區別的。通常redirect是用在當須要跳轉到另外一個頁面時用。
路由分組:
無名分組
(\d{4}) 在urls分組以後,能夠獲取分組後的值,分組後的值必須傳給view函數作參數
如:url(r"^articles/(\d{2})/(\d{2})",views.get_num) get.get_num(request,12,12)
有名分組
(?P<y>\d{4})
<y> 尖括號裏面自命名爲y
在urls分組以後,能夠獲取分組後的值,分組後的值是以鍵值方式傳給視圖函數作爲關鍵字參數
如:url("^articles/(?P<y>\d{4})/(?P<m>\d{2})$",views.get_year_month)#至關於關鍵字傳參 get_year_month(request,y=2002,m=12)
路由分發:
1.總urls中:
url("app1/",include("app1.urls")),
url("app2/",include("app2.urls")),
2.app1或app2中建立urls
3.用戶訪問時,須要地址欄須要先 ip:端口/app1/...
例子:
from django.urls import path,re_path,include from app01 import views urlpatterns = [ re_path(r'^admin/', admin.site.urls), re_path(r'^blog/', include('blog.urls')), ]
模板
1 渲染變量: {{}}
1.深度查詢
2.過濾器
{{ val|filter_name:參數 }}
{{value|default:"nothing"}} //當數據爲空時,默認值
{{value|length}} 返回長度,對字符串和列表起做用
{{value|filesizeformat}} 格式化文件大小,人類可讀
date
var value = datatime.datetime.now()
{{value|date:"Y-m-d"}}
slice 切片
value ="hello world"
{{value|slice:"2:-1"}}
truncatechars
{{value|truncatechars:9}} //按字節截取
{{value|truncatewords:9}} //截取單詞
safe 不須要轉義
value ='<a href="">點擊</a>'
{{value|safe}}
2 渲染標籤 {% %}
1.for 標籤
{%for item in li%}
<p>{{item}}{</p>
{% endfor%}
{% for book in li %}
<p>{{ forloop.counter}} {{ book.name }} {{forloop.first}}</p> forloop.counter 計數 forloop.first/last判斷是否爲第一次或最後一次循環
# <p>{{ forloop.counter0}}=>{{ book.name }}</p> 從0開始計數
#<p>{{ forloop.revcounter}} ,{{ book.name }}</p> forloop.revcounter 反過來計數
{% endfor %}
<tbody>
{% for book in books %}
<tr>
<td>{{ book.id}}</td>
<td>{{ book.name }}</td>
<td>{{ book.author }}</td>
<td>{{ book.price }}</td>
</tr>
{% endfor %}
</tbody>
{% for person in person_list %}
<p>{{ person.name }}</p>
{% empty %}
<p>sorry,no person here</p>
{% endfor %}
2. {% if num > 100 %}
<p>{{num}}</p>
{% else %}
<p>{{10}}</p>
{% endif %}
3. with 給比較長的變量另取別名
{% with b_name=book.0.name %}
<p> {{b_name}}</p>
{% endwith %}
4. csrf_token 標籤
{% csrf_token %} 當被render() 解析爲一個input的標籤,裏面有一個鍵值,帶着這個鍵值對去服務器,爲了安全
3 自定義過濾器和標籤:
自定義過濾器:最少一個參數,最多兩個參數
一、在settings中的INSTALLED_APPS配置當前app,否則django沒法找到自定義的simple_tag.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app1.apps.App1Config',
]
二、在app中建立templatetags模塊(模塊名只能是templatetags)
三、建立任意 .py 文件,如:customer_filter_tag.py
from django import template
register = template.Library() #register的名字是固定的,不可改變
#自定義篩選器
@register.filter
def multi_filter(x,y):
return x*y
#自定義標籤
@register.simple_tag
def multi_tag(x,y,z):
return x * y * z
4.在html 文件中,用時用{% load 自定義標籤文件名 %}
如:
{% load customer_filter_tag %}
<p>{{ num|multi_filter:2 }}</p>
<p>{% multi_tag 4 7 2 %}</p>
<p>{% multi_tag num 7 4 %}</p>
4 繼承
1.母版: base.html文件中:con這個區域的名字,佔位個位置,留個子html
{% block con %}
<p> 母版鉤子中留的內容,子html能夠經過 {{block.super}} </p>
{% endblock %}
2.子html:
頁面第一行 {% extends "base.html" %}
內容:
{% block con %}
{{ block.super }} #引用母板鉤子中留有的內容,表示不全覆蓋
{% endblock %}
反向解析:
防止硬編碼,把東西寫死了,
python 腳本中,重定向的時候,可能會把url寫死,
redirect("/index/") 改成 from django.urls import reverse _url =reverse("index")括號中對應的是別名, return redirect(_url)
服務端:urls文件中: url(r"^login/$",views.login,name="login"), 別名爲login
瀏覽器端:
form表單 action = 「{% url "別名" %}」
別名反向解析到最新的url