使用 django-admin 來創建 HelloWorld 項目:
~~~
django-admin startproject HelloWorld
~~~
* **HelloWorld:**項目的容器。
* **manage.py:**一個實用的命令行工具,可讓你以各種方式與該 Django 項目進行交互。
* **HelloWorld/\_\_init\_\_.py:**一個空文件,告訴 Python 該目錄是一個 Python 包。
* **HelloWorld/asgi.py:**一個 ASGI 兼容的 Web 服務器的入口,以便運行你的項目。
* **HelloWorld/settings.py:**該 Django 項目的設置/配置。
* **HelloWorld/urls.py:**該 Django 項目的 URL 聲明; 一份由 Django 驅動的網站"目錄"。
* **HelloWorld/wsgi.py:**一個 WSGI 兼容的 Web 服務器的入口,以便運行你的項目。
接下來我們進入 HelloWorld 目錄輸入以下命令,啟動服務器:
~~~
python3 manage.py runserver 0.0.0.0:8000
~~~
0.0.0.0 讓其它電腦可連接到開發服務器,8000 為端口號。如果不說明,那么端口號默認為 8000。
在瀏覽器輸入你服務器的 ip(這里我們輸入本機 IP 地址:**127.0.0.1:8000**) 及端口號,如果正常啟動,輸出結果如下:
## HelloWorld/HelloWorld/urls.py 文件代碼:
from django.urls import path from . import views urlpatterns = \[ path('hello/', views.hello), \]
通過瀏覽器打開**http://127.0.0.1:8000/hello**,輸出結果如下:
## path() 函數
Django path() 可以接收四個參數,分別是兩個必選參數:route、view 和兩個可選參數:kwargs、name。
語法格式:
~~~
path(route, view, kwargs=None, name=None)
~~~
* route: 字符串,表示 URL 規則,與之匹配的 URL 會執行對應的第二個參數 view。
* view: 用于執行與正則表達式匹配的 URL 請求。
* kwargs: 視圖使用的字典類型的參數。
* name: 用來反向獲取 URL。
Django2. 0中可以使用 re\_path() 方法來兼容 1.x 版本中的**url()**方法,一些正則表達式的規則也可以通過 re\_path() 來實現 。
~~~
from django.urls import include, re_path
urlpatterns = [
re_path(r'^index/$', views.index, name='index'),
re_path(r'^bio/(?P<username>\w+)/$', views.bio, name='bio'),
re_path(r'^weblog/', include('blog.urls')),
...
]
~~~
我們當然可以像上篇文章中的Hello World一樣,在Django的主模塊中加各種功能,但當項目變得巨大的時候,各種各樣的功能全都放在這里,就會顯得太過雜亂,缺乏邏輯性和層次性。
Django中App的作用就在于此,我們可以將不同類型的功能分成多個不同的App應用來開發,就如同手機上不同的App有不同的功能一樣,由手機系A統分別對其使用。
### 一、App創建和配置
創建App只需要在命令行輸入命令:
> python manage.py startapp loginworld
該命令沒有任何返回信息,但執行完后會在項目列表出現一個新的子app文件夾,

此時僅僅是app創建完成,還需要在setting的INSTALLD\_APPS 列表中進行配置才能正常使用該app應用

### 二、路由設置(urls)
* 路由規則
1. urlpatterns中的元素按照書寫順序從上往下逐一匹配正則表達式,一旦匹配成功則不再繼續。
2. 當瀏覽器訪問請求的url不是以/結尾時,jango會自動給該請求加/結尾,并讓瀏覽器重新訪問.可設置為不主動加結尾處的/,方法:在settings.py文件中加入APPEND\_SLASH=False即可,配置文件中雖然沒有這個參數,但默認結果是True;當配置完成后url請求后不加/時是訪問不到頁面的。
3. URLconf匹配的位置: URLconf 在請求的URL 上查找,將它當做一個普通的Python 字符串,會取 網址之后?號之前的字符串來做正則匹配. 且匹配出來的所有東西都是字符串形式。
* 分發思路
把本該在項目目錄下的urls.py中進行路由匹配的功能給分發到各個不同的App內,在其中新建urls.py文件來進行路由匹配;在項目目錄下的urls.py中建立分發指引路徑
* 主路由
主路由或者說全局路由通過setting中的ROOT\_URLCONF確定,默認為Django文件夾下的urls,

我們需要在主路由中引入新建的子App的路由地址,方法如下

同理推廣,我們也可以在子app上再加下級路由連到其他app或別的地方,由此設計出更復雜的多級路由
* 子路由
新建的子App默認是沒有urls的,我們需要在App目錄下新建一個urls.py文件作為子路由,在此處匹配該App對應的各種功能
在設置路由時,可以在path使用name參數為其命名,這樣就可以在views頁面和html頁面通過該名字反向獲取URL使用路由

* 項目中存在多個App,且App內功能有重復命名時:
比較簡單的做法是在每個App的urls頁面分別設置一個不同的`app_name`,如
~~~bash
#app1.urls.py
app_name = 'app1'
~~~
~~~bash
#app2.urls.py
app_name = 'app2'
~~~
即可在views和html中準確使用路由:
~~~bash
reverse('app01:hello')
reverse('app02:hello')
{% url 'app02:hello' %}
~~~
如果要實現代碼的復用,或者了解app\_name和namespace的區別可以參考[https://www.jianshu.com/p/404500a0408a](https://www.jianshu.com/p/404500a0408a)
### 三、視圖(views)
簡單地說就是一個函數,接收并處理請求,調用模型和模版,響應請求
至于詳細的,不要急,慢慢來
### 四、模型(models)
Django模型涉及數據庫相關操作,此處以mysql為例
如果沒有裝mysql 驅動,可以執行以下命令安裝:
> pip install mysqlclient
如果結合xampp和Navicat兩個軟件使用,可以更方便地查看數據庫信息。
* 數據庫配置
對于不同的數據庫均需要有不同的配置,但都是在setting中的DATABASES進行,mysql的配置方法如下
> DATABASES = {
> 'default': {
> 'ENGINE': 'django.db.backends.mysql',
> 'NAME': '此處為項目名稱',
> 'USER': '此處為數據庫用戶名',
> 'PASSWORD': '此處為數據用戶密碼',
> 'HOST':'此處為本機ip',
> 'PORT':'此處為數據庫使用端口',
> }
> }
在進行下面的步驟前,最好先在mysql中建立相對應的數據庫,使用上面設置的USER名字。
* 模型定義
Django規定,如果要使用模型,必須要創建一個App。
在App目錄的models中可按如下方法建表:
~~~python
# models.py
from django.db import models
class Test(models.Model):
user = models.CharField(max_length=20)
password = models.CharField(max_length=200)
class Meta:
#表在mysql中的名字
db_table = 'Test'
~~~
* 數據庫建表
在命令行執行下面兩條命令,可在數據庫建表,數據庫存儲時還會默認存儲一項自增的id屬性。這兩條命令前者是將model層轉為遷移文件migration,后者將新版本的遷移文件執行,更新數據庫。
> python manage.py makemigrations
> python manage.py migrate
默認情況下這兩個命令作用于全局,如果想僅僅對部分app進行作用的話 則執行如下命令:
> python manage.py makemigrations appname
> python manage.py migrate appname
如果要想精確到某一個遷移文件則可以使用:
> python manage.py makemigrations appname filename
> python manage.py migrate appname filename
* 增刪改查
想要對數據庫中已經建立的表進行任何操作,均需要引用models中的模型,如在同一App下可用“.”表示同級目錄
> from .models import Test
增刪改查的任何操作均有Django已經封裝好的函數來實現,這里大致記錄一下,詳細的以后另寫
* 增
> test1 = Test(user='root',password='123456')
> test1.save()
* 刪
刪除id=1的數據
> test1 = Test.objects.get(id=1)
> test1.delete()
另外一種方式
> Test.objects.filter(id=1).delete()
刪除所有數據
> Test.objects.all().delete()
* 改
修改其中一個id=1的name字段,再save,相當于SQL中的UPDATE
> test1 = Test.objects.get(id=1)
> test1.user= 'Google'
> test1.save()
另外一種方式
> Test.objects.filter(id=1).update(user='Google')
修改所有的列
> Test.objects.all().update(user='Google')
* 查
通過objects這個模型管理器的all()獲得所有數據行,相當于SQL中的SELECT \* FROM
> list = Test.objects.all()
filter相當于SQL中的WHERE,可設置條件過濾結果
> response2 = Test.objects.filter(id=1)
獲取單個對象
> response3 = Test.objects.get(id=1)
### 五、模板文件(html)
Django中的模版文件雖然還是.html,但本質上是html代碼+邏輯控制代碼組成,Django提供了一些標簽、過濾器和語法等用于在html中進行控制,這里的html模板是一個文本,用于分離文檔的表現形式和內容
需要注意的是,Django項目的所有模版文件即html都必須放在templates目錄下,其在setting中默認配置如下

如果在Django項目根目錄的templates中和各個app中分別創建index.html,默認訪問根目錄templates中的index.html文件,如果templates中不存在,則按照settings.py中App的設置順序進行加載。
### 六、靜態文件
在網頁中,除了html外,需要的各種css樣式文件,js執行文件以及一些圖片、聲音、視頻等,都是需要加載的動態文件。在Django中,使用static標簽來加載靜態文件。要使用static標簽,首先需要{% load static %},之后只需要引用文件相對static文件夾的路徑即可。
* setting設置
下述兩條設置在創建Django 項目的時候就已經自動設置好了,只要不修改就沒問題。
* 將“django.contrib.staticfiles”添加到INSTALLED\_APPS中;
* 設置STATIC\_URL = '/static/'
* 文件夾創建
無論在哪創建,文件夾名字都必須為static
* 在app下創建一個static文件夾,在這個static文件夾下創建一個當前app的名字的文件夾,再把靜態文件放到這個文件夾下。
這樣做的原因是,如果直接把靜態文件放在static文件夾下,那么在模版加載靜態文件的時候就是使用**文件名**,如果在多個app之間有同名的靜態文件,這時候可能就會產生混淆。而在static文件夾下加了一個同名app文件夾,在模版中加載的時候就是使用**app名/文件名**,這樣可以避免混淆。
* 如果有一些靜態文件不和任何app掛鉤。即不在任何一個app目錄下。那么可以在settings.py中的STATIC\_URL 后面位置添加STATICFILES\_DIRS,以后DTL就會在這個列表的路徑中查找靜態文件。例如我們在項目的根目錄下新建一個static文件夾,則路徑應該如下:
~~~csharp
STATICFILES_DIRS = [
os.path.join(BASE_DIR,"static")
]
#或者
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
~~~
* 引用方法
在模版中使用load標簽加載static標簽。比如要加載在項目的static文件夾下的style.css的文件。那么示例代碼如下:
~~~cpp
{% load static %}
<link rel="stylesheet" href="{% static 'style.css' %}">
~~~
要注意的是,{% load static %}需要放在html的頭部位置(至少在使用static標簽的上面),一般都是放在html的最上面。如果{% extend %}標簽和{% load static %}同時存在,{% extend %}需要放在最上面,然后再放{% load static %}等標簽。
* 偷懶方法
可以在settings中的TEMPLATES/OPTIONS添加'builtins':\['django.templatetags.static'\],這樣以后就可以在模版中直接使用static標簽,而不用手動load。