Django-App及各模塊詳解

本篇主要介紹了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只需要在命令行輸入命令:

python manage.py startapp loginworld

該命令沒有任何返回信息,但執(zhí)行完后會在項目列表出現(xiàn)一個新的子app文件夾洋访,

此時僅僅是app創(chuàng)建完成镣陕,還需要在setting的INSTALLD_APPS 列表中進行配置才能正常使用該app應(yīng)用

二、路由設(shè)置(urls)

  • 路由規(guī)則

    1. urlpatterns中的元素按照書寫順序從上往下逐一匹配正則表達式姻政,一旦匹配成功則不再繼續(xù)呆抑。
    2. 當(dāng)瀏覽器訪問請求的url不是以/結(jié)尾時,jango會自動給該請求加/結(jié)尾,并讓瀏覽器重新訪問.可設(shè)置為不主動加結(jié)尾處的/,方法:在settings.py文件中加入APPEND_SLASH=False即可,配置文件中雖然沒有這個參數(shù),但默認(rèn)結(jié)果是True;當(dāng)配置完成后url請求后不加/時是訪問不到頁面的。
    3. 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上再加下級路由連到其他app或別的地方乎完,由此設(shè)計出更復(fù)雜的多級路由

  • 子路由
    新建的子App默認(rèn)是沒有urls的熏兄,我們需要在App目錄下新建一個urls.py文件作為子路由品洛,在此處匹配該App對應(yīng)的各種功能

    在設(shè)置路由時,可以在path使用name參數(shù)為其命名摩桶,這樣就可以在views頁面和html頁面通過該名字反向獲取URL使用路由
  • 項目中存在多個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中的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()獲得所有數(shù)據(jù)行谨读,相當(dāng)于SQL中的SELECT * FROM

      list = 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)容

需要注意的是玫膀,Django項目的所有模版文件即html都必須放在templates目錄下矛缨,其在setting中默認(rèn)配置如下
如果在Django項目根目錄的templates中和各個app中分別創(chuàng)建index.html,默認(rèn)訪問根目錄templates中的index.html文件,如果templates中不存在帖旨,則按照settings.py中App的設(shè)置順序進行加載箕昭。

六、靜態(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)該如下:
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锁保。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薯酝,一起剝皮案震驚了整個濱河市半沽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吴菠,老刑警劉巖者填,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異做葵,居然都是意外死亡占哟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門酿矢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榨乎,“玉大人,你說我怎么就攤上這事瘫筐∶凼睿” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵策肝,是天一觀的道長史煎。 經(jīng)常有香客問我,道長驳糯,這世上最難降的妖魔是什么篇梭? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮酝枢,結(jié)果婚禮上恬偷,老公的妹妹穿的比我還像新娘。我一直安慰自己帘睦,他們只是感情好袍患,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著竣付,像睡著了一般诡延。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上古胆,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天肆良,我揣著相機與錄音,去河邊找鬼逸绎。 笑死惹恃,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棺牧。 我是一名探鬼主播巫糙,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颊乘!你這毒婦竟也來了参淹?” 一聲冷哼從身側(cè)響起醉锄,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浙值,沒想到半個月后恳不,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡亥鸠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年妆够,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片负蚊。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡神妹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出家妆,到底是詐尸還是另有隱情鸵荠,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布伤极,位于F島的核電站蛹找,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哨坪。R本人自食惡果不足惜庸疾,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望当编。 院中可真熱鬧届慈,春花似錦、人聲如沸忿偷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲤桥。三九已至揍拆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茶凳,已是汗流浹背嫂拴。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慧妄,地道東北人顷牌。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像塞淹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子罪裹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 項目部署到阿里云(nginx+uwsgi)上后饱普,靜態(tài)文件加載沒有問題运挫。但是在本地,使用開發(fā)服務(wù)器套耕,卻始終加載不成功...
    蘭山小亭閱讀 5,632評論 0 9
  • PythonWeb框架要點谁帕、Django介紹、工程搭建冯袍、配置匈挖、靜態(tài)文件與路由 1.Python Web 框架要點 ...
    Cestine閱讀 1,510評論 0 6
  • 處理靜態(tài)文件,尤其是在開發(fā)時康愤,是一件很頭疼的事情儡循。在這篇文章中,我們將會討論一些設(shè)置征冷,目錄結(jié)構(gòu)和他們之間的相互影響...
    51reboot閱讀 1,679評論 0 1
  • Django的來歷:python開發(fā)的择膝! long long long years ago!勞倫斯出版集團新聞 網(wǎng)...
    JAguys閱讀 349評論 0 0
  • Django是一個用 Python 編寫的 Web 框架。Web 框架是一種軟件检激,基于web框架可以開發(fā)動態(tài)網(wǎng)站肴捉,...
    guanalex閱讀 7,205評論 0 5