本章將構建、測試和部署一個帶有主頁和關於頁面的Pages應用。我們將學習Django的基於類的視圖和模板,這些都是本書後面構建的更複雜的Web應用的基礎。
創建應用
$ mkdir pages && cd pages
$ django-admin startproject config .
$ python manage.py startapp pages
$ vi config/settings.py
# config/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'pages', # new
]
模板
每個網絡框架都需要方便的方法來生成HTML文件,在Django中使用模板:可以連接在一起的獨立HTML文件,也包括基本的邏輯。
首先要考慮的是在Django項目的結構中把模板放在哪裡。有兩個選擇。默認情況下,Django的模板加載器會在每個應用中尋找相關模板。然而,這個結構有些混亂:每個應用都需要一個新的模板目錄。
└── pages
├── templates
├── pages
├── home.html
這意味着我們需要創建一個新的模板目錄,一個新的應用目錄,頁面,以及最後我們的模板本身,即home.html。
另一種方法,那就是創建項目級模板目錄,並將所有模板放在其中。通過對config/settings.py文件做一個小小的調整,我們可以告訴Django也在這個目錄下尋找模板。這就是我們要使用的方法。
$ mkdir templates
$ vi templates/home.html
<!-- templates/home.html -->
<h1>Homepage</h1>
$ vi templates/about.html
<!-- templates/about.html -->
<h1>About page</h1>
$ vi config/settings.py
# config/settings.py
TEMPLATES = [
{
...
'DIRS': [str(BASE_DIR.joinpath('templates'))], # new
...
},
]
基於類的視圖
我們將使用內置的TemplateView來顯示我們的模板。更新pages/views.py文件。
# pages/views.py
from django.views.generic import TemplateView
class HomePageView(TemplateView):
template_name = 'home.html'
class AboutPageView(TemplateView): # new
template_name = 'about.html'
URLs
config/urls.py
# config/urls.py
from django.contrib import admin
from django.urls import path, include # new
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('pages.urls')), # new
]
pages/urls.py
# pages/urls.py
from django.urls import path
from .views import HomePageView, AboutPageView # new
urlpatterns = [
path('about/', AboutPageView.as_view(), name='about'), # new
path('', HomePageView.as_view(), name='home'),
]
當使用基於類的視圖時,你總是在視圖名稱的後面加上as_view()。

擴展模板
$ touch templates/base.html
$ vi templates/base.html
<!-- templates/base.html -->
<header>
<a href="{% url 'home' %}">Home</a> |
<a href="{% url 'about' %}">About</a>
</header>
{% block content %}
{% endblock content %}
$vi templates/home.html
<!-- templates/home.html -->
{% extends 'base.html' %}
{% block content %}
<h1>Homepage</h1>
{% endblock content %}
$vi templates/about.html
<!-- templates/about.html -->
{% extends 'base.html' %}
{% block content %}
<h1>About page</h1>
{% endblock content %}

測試

# pages/tests.py
from django.test import SimpleTestCase
class SimpleTests(SimpleTestCase):
def test_home_page_status_code(self):
response = self.client.get('/')
self.assertEqual(response.status_code, 200)
def test_about_page_status_code(self):
response = self.client.get('/about/')
self.assertEqual(response.status_code, 200)
我們在這裡使用 SimpleTestCase 因為我們沒有使用數據庫。如果我們使用數據庫,我們會使用 TestCase。然後我們檢查每個頁面的狀態碼是否為 200,這是成功 HTTP 請求的標準響應。
執行:
$ python manage.py test
System check identified no issues (0 silenced).
..
----------------------------------------------------------------------
Ran 2 tests in 0.060s
OK

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/232810.html