專案建立好,現在可以動手寫Quiz App了。
Project跟app的關係就像是,假設現在進到一家保險公司的網站,你既可以在網站上買保單,也可以申請理賠,一個網站不只提供單一功能。Django讓我們可以在project下面管理多個app,這樣在架構較為龐大而複雜的網站時,多管齊下不是問題。
建立Quiz App
在Terminal鍵入下列後即可在mysite專案下建立一個叫quiz的app:
1 | python manage.py startapp quiz |
執行完後他會產生一個quiz的資料夾及下面這些檔案:
1 | quiz/ migrations/ __init__.py __init__.py admin.py apps.py models.py tests.py views.py |
Django的架構模式是由Models、Views及Template所組成,我們在models.py寫資料儲存的模型,在views.py撰寫邏輯,在template可以放置.html,但現在還看不到template的資料夾,這需要自己手動增加,而且template不會放在app裡面。
第一個網頁
先在views撰寫網頁邏輯:
1 | *quiz/views.py*from django.http import HttpResponsedef index(request): return HttpResponse(\"Hello, world. You're at the quiz index.\") |
既然寫好了一個功能,那怎麼把它具象化變成我們想像中的樣子,首先在quiz底下新增urls.py,這邊可以先複製mysite的url.py內容貼過來,再修改如下,path()有4個參數,必要的有url及views。
1 | *quiz/urls.py*from django.urls import pathfrom . import viewsurlpatterns = [ path('', views.index, name='index'),] |
除了在app的url.py作配置,我們還要再來到project底下的url.py作配置:
1 | **mysite/urls.py**from django.contrib import adminfrom django.urls import include, pathfrom quiz import as quiz_viewsurlpatterns = [ path('quiz/', quiz_views.index), path('admin/', admin.site.urls),] |
上面寫法沒問題,但你可以想到的是,這樣每當在app新增一個功能,你就要作兩次的url設定,這邊其實可以透過Django的函式include()簡化這個作法:
1 | **mysite/urls.py**....省略...urlpatterns = [ path('quiz/', include('quiz.urls')), path('admin/', admin.site.urls),] |
執行下面命令,來看看我們有沒有成功:
1 | python manage.py runserver |
執行完點選 “http://127.0.0.1:8000/" 找不到網頁是正常,先跳到”http://127.0.0.1:8000/quiz\\" ,就可以看到畫面了。
明天想再繼續講path跟include,今天只有空寫個大概,其實了解這些函式誕生的背後原因蠻有趣的。