本篇主要介紹了Django的App及各模塊功能、配置情況,具體的各種語法及函數(shù),后面有空會分篇記錄
我們當(dāng)然可以像上篇文章中的Hello World一樣洁闰,在Django的主模塊中加各種功能,但當(dāng)項目變得巨大的時候万细,各種各樣的功能全都放在這里扑眉,就會顯得太過雜亂纸泄,缺乏邏輯性和層次性。
Django中App的作用就在于此腰素,我們可以將不同類型的功能分成多個不同的App應(yīng)用來開發(fā)聘裁,就如同手機上不同的App有不同的功能一樣,由手機系A(chǔ)統(tǒng)分別對其使用弓千。
一衡便、App創(chuàng)建和配置
創(chuàng)建App只需要在命令行輸入命令:
該命令沒有任何返回信息,但執(zhí)行完后會在項目列表出現(xiàn)一個新的子app文件夾洋访,python manage.py startapp loginworld
二、路由設(shè)置(urls)
-
路由規(guī)則
- urlpatterns中的元素按照書寫順序從上往下逐一匹配正則表達式姻政,一旦匹配成功則不再繼續(xù)呆抑。
- 當(dāng)瀏覽器訪問請求的url不是以/結(jié)尾時,jango會自動給該請求加/結(jié)尾,并讓瀏覽器重新訪問.可設(shè)置為不主動加結(jié)尾處的/,方法:在settings.py文件中加入APPEND_SLASH=False即可,配置文件中雖然沒有這個參數(shù),但默認(rèn)結(jié)果是True;當(dāng)配置完成后url請求后不加/時是訪問不到頁面的。
- URLconf匹配的位置: URLconf 在請求的URL 上查找汁展,將它當(dāng)做一個普通的Python 字符串,會取 網(wǎng)址之后?號之前的字符串來做正則匹配. 且匹配出來的所有東西都是字符串形式鹊碍。
分發(fā)思路
把本該在項目目錄下的urls.py中進行路由匹配的功能給分發(fā)到各個不同的App內(nèi),在其中新建urls.py文件來進行路由匹配;在項目目錄下的urls.py中建立分發(fā)指引路徑-
主路由
主路由或者說全局路由通過setting中的ROOT_URLCONF確定食绿,默認(rèn)為Django文件夾下的urls侈咕,
同理推廣炫欺,我們也可以在子app上再加下級路由連到其他app或別的地方乎完,由此設(shè)計出更復(fù)雜的多級路由
-
子路由
在設(shè)置路由時,可以在path使用name參數(shù)為其命名摩桶,這樣就可以在views頁面和html頁面通過該名字反向獲取URL使用路由
新建的子App默認(rèn)是沒有urls的熏兄,我們需要在App目錄下新建一個urls.py文件作為子路由品洛,在此處匹配該App對應(yīng)的各種功能
項目中存在多個App,且App內(nèi)功能有重復(fù)命名時:
比較簡單的做法是在每個App的urls頁面分別設(shè)置一個不同的app_name
桥状,如
#app1.urls.py
app_name = 'app1'
#app2.urls.py
app_name = 'app2'
即可在views和html中準(zhǔn)確使用路由:
reverse('app01:hello')
reverse('app02:hello')
{% url 'app02:hello' %}
如果要實現(xiàn)代碼的復(fù)用,或者了解app_name和namespace的區(qū)別可以參考http://www.reibang.com/p/404500a0408a
三硝清、視圖(views)
簡單地說就是一個函數(shù)辅斟,接收并處理請求,調(diào)用模型和模版芦拿,響應(yīng)請求
至于詳細的士飒,不要急,慢慢來
四蔗崎、模型(models)
Django模型涉及數(shù)據(jù)庫相關(guān)操作酵幕,此處以mysql為例
如果沒有裝mysql 驅(qū)動,可以執(zhí)行以下命令安裝:
pip install mysqlclient
如果結(jié)合xampp和Navicat兩個軟件使用缓苛,可以更方便地查看數(shù)據(jù)庫信息芳撒。
- 數(shù)據(jù)庫配置
對于不同的數(shù)據(jù)庫均需要有不同的配置,但都是在setting中的DATABASES進行,mysql的配置方法如下
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '此處為項目名稱',
'USER': '此處為數(shù)據(jù)庫用戶名',
'PASSWORD': '此處為數(shù)據(jù)用戶密碼',
'HOST':'此處為本機ip',
'PORT':'此處為數(shù)據(jù)庫使用端口',
}
}
在進行下面的步驟前笔刹,最好先在mysql中建立相對應(yīng)的數(shù)據(jù)庫芥备,使用上面設(shè)置的USER名字。
- 模型定義
Django規(guī)定舌菜,如果要使用模型萌壳,必須要創(chuàng)建一個App。
在App目錄的models中可按如下方法建表:
# 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'
- 數(shù)據(jù)庫建表
在命令行執(zhí)行下面兩條命令日月,可在數(shù)據(jù)庫建表讶凉,數(shù)據(jù)庫存儲時還會默認(rèn)存儲一項自增的id屬性。這兩條命令前者是將model層轉(zhuǎn)為遷移文件migration山孔,后者將新版本的遷移文件執(zhí)行懂讯,更新數(shù)據(jù)庫。
python manage.py makemigrations
python manage.py migrate
默認(rèn)情況下這兩個命令作用于全局台颠,如果想僅僅對部分app進行作用的話 則執(zhí)行如下命令:
python manage.py makemigrations appname
python manage.py migrate appname
如果要想精確到某一個遷移文件則可以使用:
python manage.py makemigrations appname filename
python manage.py migrate appname filename
-
增刪改查
想要對數(shù)據(jù)庫中已經(jīng)建立的表進行任何操作褐望,均需要引用models中的模型,如在同一App下可用“.”表示同級目錄from .models import Test
增刪改查的任何操作均有Django已經(jīng)封裝好的函數(shù)來實現(xiàn)串前,這里大致記錄一下瘫里,詳細的以后另寫
-
增
test1 = Test(user='root',password='123456')
test1.save() -
刪
刪除id=1的數(shù)據(jù)test1 = Test.objects.get(id=1)
test1.delete()另外一種方式
Test.objects.filter(id=1).delete()
刪除所有數(shù)據(jù)
Test.objects.all().delete()
-
改
修改其中一個id=1的name字段,再save荡碾,相當(dāng)于SQL中的UPDATEtest1 = 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()獲得所有數(shù)據(jù)行谨读,相當(dāng)于SQL中的SELECT * FROMlist = Test.objects.all()
filter相當(dāng)于SQL中的WHERE,可設(shè)置條件過濾結(jié)果
response2 = Test.objects.filter(id=1)
獲取單個對象
response3 = Test.objects.get(id=1)
-
五坛吁、模板文件(html)
Django中的模版文件雖然還是.html劳殖,但本質(zhì)上是html代碼+邏輯控制代碼組成,Django提供了一些標(biāo)簽拨脉、過濾器和語法等用于在html中進行控制哆姻,這里的html模板是一個文本,用于分離文檔的表現(xiàn)形式和內(nèi)容
六、靜態(tài)文件
在網(wǎng)頁中解阅,除了html外落竹,需要的各種css樣式文件,js執(zhí)行文件以及一些圖片瓮钥、聲音筋量、視頻等烹吵,都是需要加載的動態(tài)文件。在Django中桨武,使用static標(biāo)簽來加載靜態(tài)文件肋拔。要使用static標(biāo)簽,首先需要{% load static %}呀酸,之后只需要引用文件相對static文件夾的路徑即可凉蜂。
-
setting設(shè)置
下述兩條設(shè)置在創(chuàng)建Django 項目的時候就已經(jīng)自動設(shè)置好了,只要不修改就沒問題性誉。- 將“django.contrib.staticfiles”添加到INSTALLED_APPS中窿吩;
- 設(shè)置STATIC_URL = '/static/'
-
文件夾創(chuàng)建
無論在哪創(chuàng)建,文件夾名字都必須為static- 在app下創(chuàng)建一個static文件夾错览,在這個static文件夾下創(chuàng)建一個當(dāng)前app的名字的文件夾纫雁,再把靜態(tài)文件放到這個文件夾下。
這樣做的原因是倾哺,如果直接把靜態(tài)文件放在static文件夾下轧邪,那么在模版加載靜態(tài)文件的時候就是使用文件名,如果在多個app之間有同名的靜態(tài)文件羞海,這時候可能就會產(chǎn)生混淆忌愚。而在static文件夾下加了一個同名app文件夾,在模版中加載的時候就是使用app名/文件名却邓,這樣可以避免混淆硕糊。 - 如果有一些靜態(tài)文件不和任何app掛鉤。即不在任何一個app目錄下腊徙。那么可以在settings.py中的STATIC_URL 后面位置添加STATICFILES_DIRS简十,以后DTL就會在這個列表的路徑中查找靜態(tài)文件。例如我們在項目的根目錄下新建一個static文件夾昧穿,則路徑應(yīng)該如下:
- 在app下創(chuàng)建一個static文件夾错览,在這個static文件夾下創(chuàng)建一個當(dāng)前app的名字的文件夾纫雁,再把靜態(tài)文件放到這個文件夾下。
STATICFILES_DIRS = [
os.path.join(BASE_DIR,"static")
]
#或者
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
- 引用方法
在模版中使用load標(biāo)簽加載static標(biāo)簽勺远。比如要加載在項目的static文件夾下的style.css的文件。那么示例代碼如下:
{% load static %}
<link rel="stylesheet" href="{% static 'style.css' %}">
要注意的是时鸵,{% load static %}需要放在html的頭部位置(至少在使用static標(biāo)簽的上面),一般都是放在html的最上面厅瞎。如果{% extend %}標(biāo)簽和{% load static %}同時存在饰潜,{% extend %}需要放在最上面,然后再放{% load static %}等標(biāo)簽和簸。
-
偷懶方法
可以在settings中的TEMPLATES/OPTIONS添加'builtins':['django.templatetags.static']彭雾,這樣以后就可以在模版中直接使用static標(biāo)簽,而不用手動load锁保。