Django 的學習 https://www.cnblogs.com/yuanchenqi/articles/8875659.html https://www.cnblogs.com/yuanchenqi/articles/7629939.html http://www.cnblogs.com/haiyan123/p/7701412.html MTV 模型 M model (負責業務物件和資料庫的關係對映)(orm) T template (存放html,負責把頁面展示給使用者) V view (檢視,負責業務邏輯,在適當的時候呼叫model和template) Django 有一個URL控制器(路徑和函式關係的對映,pattern),根據URL pattern 來分發給不同的view函式處理,view呼叫相應的model和template 返回頁面給使用者 一般是使用者通過瀏覽器向我們的伺服器發起一個請求(request),這個請求回去訪問檢視函式,(如果不涉及到資料呼叫,那麼這個時候檢視函式返回一個模板也就是一個網頁給使用者),檢視函式呼叫模型,模型去資料庫查詢資料,然後逐級返回,檢視函式把返回的資料填充到模板中空格中,最後返回網頁給使用者。 django 的安裝 pip3 install django(目前最新版本是2.0) 我們上課的時候用的是1.x版本,所以這裡我也裝1.11版本的 pip3 install django==1.11 django 是下載在python3 直譯器的lib 目錄下面了 下載完成後會看到我們的scripts 多了django-admin.exe django-admin.py 使用django-admin.py startproject myproject 建立專案 使用cd myproject && python3 manage.py startapp app01 建立應用 我們使用命令列或者是pycharm 建立一個專案,專案名是Myproject,然後我們再建立一個應用的名字app01 建立完成之後的目錄結構是這樣的 myproject-------------------------->這個是專案名,可以更改 app01-------------------------->專案應用的名稱,我們要是有多個應用這裡我們還可以有app02,app03 migrations __init__.py admin.py models.py tests.py views.py myproject----------------------->這個名字不可更改,這裡的配置是應用於全域性配置的 __init__.py settings.py----------------->存放專案的配置檔案 urls.py--------------------->路徑和檢視函式的對映關係,看urlpatterns字典,當應用很多的時候,我們應該在每個應用裡面建立一個urls.py wsgi.py--------------------->和socket相關 templates----------------------->存放各種html檔案,css,js 會放在新的static資料夾 manage.py----------------------->與Django專案進行互動的指令碼,啟動的時候我們執行python manage.py runnserver IP PORT,預設8000埠 這裡我們分不同的應用是為了解耦 url 匹配規則自上而下。上面匹配上了,不再往下匹配 HttpResponse :封裝響應體的類,返回任何資料,都應該放在HttpResponse裡返回 這裡舉例我們的url 路徑是timer 那麼就會匹配上這一條規則 url(r'^timer/', views.timer),就去執行 檢視函式中的timer(形參xxx)函式,傳入一個request 實參,request 包含所有的請求資訊,當我們請求的時候 Django中的wsgi把所有的請求資訊封裝成request物件,封裝好之後立馬傳給timer,timer 函式要是利用任何一個 request 的任意一個物件資訊的時候直接從request物件裡取就可以了 render : render(request, template_name[, context]) 結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的 HttpResponse 物件。 按照settings配置指定的路徑找到html 檔案 引數: request: 用於生成響應的請求物件。 template_name:要使用的模板的完整名稱,可選的引數,這裡我們直接templates目錄下的html檔名即可,因為在setting.py 中 TEMPLATES 列表配置了templates的環境變數,'DIRS': [os.path.join(BASE_DIR,'templates')] context:新增到模板上下文的一個字典。預設是一個空字典。如果字典中的某個值是可呼叫的,檢視將在渲染模板之前呼叫它。 content_type:生成的文件要使用的MIME型別。預設為DEFAULT_CONTENT_TYPE 設定的值。 status:響應的狀態碼。預設為200。 render 其實最終也是呼叫的HttpResponse ctime = str(time.time()) name = 'bigbao' age = '18' return render(request,"time.html",{'ctime':ctime,'name':name,'age':age}) 這裡的“ctime” key 是html模板中要引用的,ctime是上面函式取到的 模板語法: 目的是將變數(資料庫的內容)如何巧妙的嵌入到html頁面中(就不用之前我們用的字串拼接了) 在 Django 模板中遍歷複雜資料結構的關鍵是句點字元,語法: {{var_name}} render 方法有兩個功能: 返回一個頁面 模板語法:將變數巧妙的嵌入html頁面中 return HttpResponse("訪問成功") 返回的一定是一個字串,如果想返回純字串,就用HttpResponse方法 我們在post資料的時候我們可以再request.POST 物件裡面取到我們提交的資料 比如說我們在form表單裡提交了我們input裡定義的兩個input元素名稱 user_name 和 pwd,那麼我們就可以再request.post.get('user_name') 和request.post.get('pwd') 取到相應的值 URL控制器 url組成部分: 協議://ip(域名):埠/路徑?引數 url的功能: url路徑和檢視函式的對映關係 1、一旦匹配成功則不再繼續 2、若要從URL 中捕獲一個值,只需要在它周圍放置一對圓括號。url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), # 無名分組: url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive) 給函式傳入兩個實參 # 有名分組(就是給分組起個名字,這樣定義的好處就是按照關鍵字引數去傳參了,指名道姓的方式)語法:(?P<name>pattern) url(r'^article/(?P<year>\d{4})/(?P<month>\d{2})$', views.year_month_hasname),這樣函式year_month_hasname裡會有兩個形參的名字是year和moth和位置無關 URL 分發: 這裡我們應該解耦,我們可以把每個URL pattern 放在自己的應用下面,在我們自己的應用下面建立一個urls.py檔案 全域性配置的urls.py 需要配置如下 from django.conf.urls import url,include url(r'^app01/', include('app01.urls')) 也就是說訪問路徑以app01 開頭的路徑都到app01 下面的的urls去匹配規則 URL 反射:我們把我們的url路徑加上一個別名,然後直接呼叫別名路徑,這樣我們以後修改URL路徑的時候別名不改,改動就小了,不然的話改動太大 url(r'^login/',name=xxxxx),這樣我們以後修改url 的時候,這裡我們以後修改路徑的時候我們直接修改成如下: url(r'^login.hhhtml/',name=xxxxx) 反向解析 這樣我們在模板語法中標籤怎麼呼叫這個變數呢, <form action="{% url 'xxxxx' %}" method="post"> 我們就會跳到login.hhhtml/頁面了,我們不需要修改其他的東西 這裡我們去找別名是 xxxxx 的URL,然後我們找到的是 login.hhhtml ,然後把login.hhhtml/ 放到action裡面,把{% url 'xxxxx' %} 換成 login.hhhtml/ 檢視函式 1 request 物件 request.GET request.POST request.method request.path request.get_full_path() 2 HttpResponse Django 必須相應HttpResponse 物件 HttpResponse 用來相應字串 render 用來響應模板 redirect 重定向 from django.shortcuts import render,HttpResponse,redirect 比如說我們登入成功之後給我們重定向到首頁 return redirect('/index/') 模板語法 http://www.cnblogs.com/haiyan123/p/7725568.html 變數渲染{{ }} 深度查詢: 說到底就是利用句點符來操作 傳入列表的時候,我們html 中變數引用的時候用{{ list.3 }} 傳入字典的時候,html 模板語法中用 {{ dict.key }} 過濾器: 語法: {{obj|filter__name:param}} default 過濾器: date 過濾器:{{ value|date:"Y-m-d" }} length 過濾器:{{ value|length }} filesizeformat 過濾器:{{ value|filesizeformat }} slice 過濾器:{{ value|slice:"2:-1" }} truncatechars 過濾器:{{ content|truncatechars:20 }} 標籤渲染{ %% } for 迴圈標籤 我麼可以用到{{ forloop.counter }} 來新增數字,需在for迴圈內用,我們要是迴圈字典我們可以利用dict.items <ul> {% for book in book_list %} <li>{{ book }}</li> {% endfor %} </ul> if 標籤 {% for foo in score %} {% if foo > 100 %} <p> {{ foo }}</p> {% endif %} {% endfor %} 靜態檔案的引入: # 別名,以後實際用的時候用的是這個別名,STATICFILES_DIRS 是Django用的,STATICFILES_DIRS 和 STATIC_URL 必須都存在,結合使用的 # 我們在用STATIC_URL別名的時候,Django 會自己去找到他的實際路徑,我們在html應用靜態檔案的時候必須用別名,比如 # <script src="/static/jquery.js"></script> 這個就是我靜態檔案應用的格式 # 下面這個兩個是在setting.py 檔案裡面配置的 STATIC_URL = '/static/' # 檔案的實際存在目錄,必須叫STATICFILES_DIRS STATICFILES_DIRS=[os.path.join(BASE_DIR,"static")] 模板的繼承 我們寫一個繼承模板base.html 繼承模板裡的 {% block content %} 繼承模板的內容 {% endblock content %} 然後我們在我們的子模板裡,首行加上{% extends 'base.html' %} 然後在html 檔案中寫入 {% block content %} 自己的獨特內容,這種情況下會覆蓋父模板的內容,我麼可以加上{{ block.super }},父模板的內容在子模板也出現 {% endblock content %} ORM http://www.cnblogs.com/yuanchenqi/articles/8933283.html 有幾個問題: 1、python3 我們用的資料庫連結用的是pymysql,所以這裡我們在全域性的__init__.py 檔案或者是工程的__init__.py 檔案加上如下兩句話 import pymysql pymysql.install_as_MySQLdb() 2、然後把配置檔案setting.py 中的DATABASES 的sqlite3 換成mysql DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'orm',# 要連線的資料庫,連線前需要建立好 'USER':'root',# 連線資料庫的使用者名稱 'PASSWORD':'abcd1234',# 連線資料庫的密碼 'HOST':'10.10.20.17',# 連線主機,預設本級 'PORT': 3306 # 埠 預設3306 } } 3、models.py 中 建立 表的類 class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=32) state = models.BooleanField() pub_date = models.DateField() price = models.DecimalField(max_digits=8, decimal_places=2) publish = models.CharField(max_length=32) 4、初始化資料庫 python manage.py makemigrations (這一步就報錯了) python manage.py migrate 在執行初始化資料庫的時候遇到 No changes detected 然後按照網上的方法,python manage.py makemigrations app01 ,同時在setting.py 裡的INSTALLED_APPS新增一行'app01' 然後再去刪除相應的快取,再執行 python manage.py makemigrations app01 python manage.py migrate