圖書管理系統分別有三張表 做者表 書籍表 出版社表 他們 的對應關係爲html
首先咱們須要在 app文件裏 的 models建立出 這三張表 而後作對應關係 前端
複習Django的操做: 1.建立好app後須要 將app添加到INSTALLED_APP = [] 裏面python
2.在Django中添加mysql數據庫 >>>點擊 側邊欄中的 database >>>而後左上角的加號 >>> 點擊 Data source (數據來源) >>>選擇mysqlmysql
3.在app文件 或者 Django文件下的 __init__文件裏 導入 pymysql 文件 使用 pymysql.install_as_Mysqldb() 代碼來指定使用的模塊正則表達式
4.須要在配置文件裏 修改 Django默認使用鏈接數據庫的模塊 改成 pymysql 在settings文件裏找到 DATABASES 如圖4修改:sql
注意 須要 先下載她讓下載的驅動(driver) 文件 而後選擇 driver 5.1 啓動就好了 數據庫
# Create your models here. class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=32) price = models.IntegerField(null=True) # 多對多 author = models.ManyToManyField(to='Author') publish = models.ForeignKey(to='Publish') class Author(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) class Publish(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32)
使用代碼來建立表與表之間的關係 django
一對多 ForeignKey(to='Publish')
一對一 OneToOneField(to='AuthorDetail')
多對多 ManyToManyField(to='Author')json
最後強調! 只要牽扯到models及數據庫操做字段 後 必須 要數據庫 遷移後端
代碼 python3 manage.py makemigrations
python3 manage.py migrate
咱們會發現 在 urlpatterns (patterns 花樣 模型 形態)中的 url(......,) 的第一個參數 是一個正則表達式
且 先記住 在 瀏覽器 輸入的 後綴 一旦匹配到了 內容 就不會 往下繼續匹配 而是 直接執行相應的視圖函數 比如如:
url(r'^data/', 功能) url(r'^datasssss/, 功能') 他就會 直接執行 data相應的視圖函數
Django在路由匹配的時候 當你沒有在 瀏覽器中敲最後的斜杆時 django會先拿着你沒有敲斜杆的內容去匹配 若是沒有 匹配上 會讓瀏覽器 在末尾 添加斜杆後 再次發一次 請求在匹配 若是仍是匹配不上的話就會報錯!
若是你想取消該機制 不想作二次匹配的話 能夠在 settings文件中指定
APPEND_SLASH = False # 默認參數是True slash(斜線)
url(r'^test/([0-9]{4})/', views.test) 0到9 4位
路由匹配的時候 會將括號內的正則表達式匹配到的內容 當作位置參數 傳給 視圖函數 這麼說 的話 他的參數就不止request了
url(r'^test/(?P<year>\d+)/', views.test)
在括號內 ?p< > 就是 起別名
路由匹配的時候 會將括號內正則表達式匹配到的內容 當作關鍵字參數傳遞給視圖函數
此時你的 位置參數就可使用 他起的別名了
# 無名有名不能混合使用 !!! url(r'^test/(\d+)/(?P<year>\d+)/', views.test),
可是用一種分組下 可使用多個 # 無名分組支持多個 # url(r'^test/(\d+)/(\d+)/', views.test), # 有名分組支持多個 # url(r'^test/(?P<year>\d+)/(?P<xx>\d+)/', views.test),
這樣的話 咱們的關鍵字就有兩個了
url(r'^$',views.home)
本質:本質其實就是 給你返回一個可以返回對應的 url的地址
1.咱們須要給url 和 視圖 函數起別名 例如
url(r'^index/$',views.index,name='kkk')
2.反向解析
後端的反向解析
後端能夠在任意位置 經過reverse 方向解析出 對應的url
from django.shortcuts import render,HttpResponse,redirect,reverse 小白必回三板斧 後加入 reverser reverse('kkk')
shortcuts(快捷方式)
前端的反向解析
{% url 'kkk' %}
應用場景 防止代碼寫死了 假如說你的html中的 a 標籤 有1000個 指向 路由 /index/ 可是你的產品經理 忽然說 你給老子 把 那個 url 的參數改了 那麼這1000個a 標籤就gg 了 咱們 就能夠先給 路由和視圖函數起別名 標籤 name='kkk'
咱們 前端頁面中的a標籤括號內使用 {%url 'kkk'%} 就能夠反向解析到 你 url後綴了 就不怕你變了 一樣 咱們 還能夠 在 後端 中使用 reverser('')內填寫你起的別名 就能夠反向解析到他的 url了
無名分組反向解析 url(r'^index/(\d+)/$',views.index,name='kkk') 後端反向解析 reverse('kkk',args=(1,)) # 後面的數字一般都是數據的id值 前端反向解析 {% url 'kkk' 1%} # 後面的數字一般都是數據的id值
有名分組反向解析 同無名分組反向解析意義的用法 url(r'^index/(?P<year>\d+)/$',views.index,name='kkk') 後端方向解析 print(reverse('kkk',args=(1,))) # 推薦你使用上面這種 減小你的腦容量消耗 print(reverse('kkk',kwargs={'year':1})) 前端反向解析 <a href="{% url 'kkk' 1 %}">1</a> # 推薦你使用上面這種 減小你的腦容量消耗 <a href="{% url 'kkk' year=1 %}">1</a> 注意:在同一個應用下 別名千萬不能重複!!!
當你的Django項目過於龐大的時候 路由與視圖函數對應關係就特別的多而亂 那麼咱們的總路由 url.py 的代碼就太過冗餘 不易維護
每個應用均可以有本身的 url.py static.py templates文件夾
基於以上的條件 就能夠實現多人分組開發 等開發完以後 就能夠建立 一個 新的 Django項目 把app都註冊了 加入
在總路由實現路由分發 而再也不作路由匹配 交給 app中的 url 來匹配
當你的視圖函數比較多的時候 你也能夠建立一個 views 文件夾 裏面能夠 根據 不一樣的 功能建立不一樣的文件
單詞 include (包含)
在 url.py中的 urlpatterns = [
url(r'^app01',include('app01.urls'))
] 單詞 >> patterns 模式
也可使用模塊的導入的方式 來 寫
from app01 import urls as app01_urls url(r'^app01',include(app01_urls))
複習Django建立項目以及app
以及建立 Django項目的代碼 先下載 Django 版本爲 1.11.11
確認是否下載成功
出現不少代碼就是下載成功了
建立Django項目 必定要先找到指定的文件夾 使用cd切換 單詞 project 項目
建立app的兩種方法
使用命名來啓動 Django項目
注意 用命令行建立django項目 不會自動新建templates模板文件夾
須要你本身手動建立 而且須要你本身去settings.py文件中註冊該文件路徑
多個app起了相同的別名 這個時候反向解析的時候 不會 自動識別應用前綴
這個時候就須要用到名稱空間
from django.conf.urls import url
總路由 url(r'^app01/',include('app01.urls',namespace='app01')) url(r'^app02/',include('app02.urls',namespace='app02')) 後端解析的時候 reverse('app01:index') reverse('app02:index') 前端解析的時候 {% url 'app01:index' %} {% url 'app02:index' %}
靜態頁面:數據是死的, 萬年不變的
僞靜態網頁的設計就是爲了 增長 百度的搜索引擎 seo的查詢力度
全部的搜索引擎其實都是一個巨大的爬蟲程序
網站優化相關 經過僞靜態確實能夠提升你的網站被查詢出來的機率
可是再怎麼優化也抵不過RMB玩家
虛擬環境 通常狀況下 咱們會給每個項目 配備該項目所須要的模塊 不須要的一律不裝 虛擬環境 就相似於爲每一個項目量身定作的解釋器環境 如何建立虛擬環境 每建立一個虛擬環境 就相似於你又下載了一個全新的python解釋器 django版本的區別 django1.X跟django2.X版本區別 路由層1.X用的是url 而2.X用的是path 2.X中的path第一個參數再也不是正則表達式,而是寫什麼就匹配什麼 是精準匹配 當你使用2.X不習慣的時候 2.X還有一個叫re_path 2.x中的re_path就是你1.X的url 雖然2.X中path不支持正則表達式 可是它提供了五種默認的轉換器 1.0版本的url和2.0版本的re_path分組出來的數據都是字符串類型 默認有五個轉換器,感興趣的本身能夠課下去試一下 str,匹配除了路徑分隔符(/)以外的非空字符串,這是默認的形式 int,匹配正整數,包含0。 slug,匹配字母、數字以及橫槓、下劃線組成的字符串。 uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。 path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?
視圖層 1.小白必會三板斧 1.HttpResponse 2.render 3.redirect django視圖函數必需要給返回一個HttpResponse對象 先後端分離 前端一我的幹(前端轉成自定義對象) JSON.stringify() json.dumps() JSON.parse() json.loads() 後端另外一個幹(python後端用字典) 只要涉及到數據交互,通常狀況下都是用的json格式 後端只負責產生接口,前端調用該接口能拿到一個大字典 後端只須要寫一個接口文檔 裏面描述字典的詳細信息以及參數的傳遞 2.JsonReponse from django.http import JsonResponse def index(request): data = {'name':'jason好帥哦 我好喜歡','password':123} l = [1,2,3,4,5,6,7,8] # res = json.dumps(data,ensure_ascii=False) # return HttpResponse(res) # return JsonResponse(data,json_dumps_params={'ensure_ascii':False}) return JsonResponse(l,safe=False) # 若是返回的不是字典 只須要修改safe參數爲false便可 3.上傳文件 form表單上傳文件須要注意的事項 1.enctype須要由默認的urlencoded變成formdata 2.method須要由默認的get變成post (目前還須要考慮的是 提交post請求須要將配置文件中的csrf中間件註釋) 若是form表單上傳文件 後端須要在request.FILES獲取文件數據 而再也不是POST裏面 request.method request.GET request.POST request.FILES request.path # 只回去url後綴 不獲取?後面的參數 request.get_full_path() # 後綴和參數所有獲取