1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
|
---
title: 'Django Tutorial Part 5: Creating our home page'
slug: Learn/Server-side/Django/Home_page
translation_of: Learn/Server-side/Django/Home_page
---
<div>{{LearnSidebar}}</div>
<div>{{PreviousMenuNext("Learn/Server-side/Django/Admin_site", "Learn/Server-side/Django/Generic_views", "Learn/Server-side/Django")}}</div>
<p class="summary">我們現在可以添加代碼,來顯示我們的第一個完整頁面 - <a href="https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Tutorial_local_library_website">LocalLibrary</a> 網站的主頁,顯示每個模型類型有多少條記錄,並提供我們其他頁面的側邊欄導航鏈接。一路上,我們將獲得編寫基本URL 地圖和視圖、從數據庫獲取記錄、以及使用模板的實踐經驗。</p>
<table class="learn-box standard-table">
<tbody>
<tr>
<th scope="row">前提:</th>
<td>讀 the <a href="/zh-TW/docs/Learn/Server-side/Django/Introduction">Django Introduction</a>. 完成上章節 (including <a href="/zh-TW/docs/Learn/Server-side/Django/Admin_site">Django Tutorial Part 4: Django admin site</a>).</td>
</tr>
<tr>
<th scope="row">目的:</th>
<td>了解如何創建簡單的URL映射和視圖(沒有數據編碼在URL中)以及如何從模型中獲取數據並創建模版。<br>
概要</td>
</tr>
</tbody>
</table>
<h2 id="總覽">總覽</h2>
<p>在定義了模型並創建了一些可以使用的初始庫記錄之後,是時候編寫將這些信息呈現給用戶的代碼了。 我們要做的第一件事是確定我們要在頁面中顯示的信息,並定義用於返回這些資源的URL。 然後,我們將創建一個URL映射器,視圖和模板來顯示頁面。</p>
<p>下圖描述了主要數據流,以及處理HTTP請求和響應時所需的組件。 當我們已經實現了模型時,我們將創建的主要組件是:</p>
<ul>
<li>URL映射器將支持的URL(以及URL中編碼的任何信息)轉發到適當的視圖功能。</li>
<li>查看函數可從模型中獲取所需的數據,創建顯示數據的HTML頁面,並將頁面返回給用戶以在瀏覽器中查看。</li>
<li>在視圖中呈現數據時要使用的模板。</li>
</ul>
<p><img alt="" src="https://mdn.mozillademos.org/files/13931/basic-django.png" style="display: block; margin: 0px auto;"></p>
<p>正如您將在下一節中看到的那樣,我們將顯示5頁,這是太多信息,無法在一篇文章中進行記錄。 因此,本文將重點介紹如何實現主頁,我們將在後續文章中介紹其他頁面。 這應該使您對URL映射器,視圖和模型在實踐中如何工作有很好的端到端理解。</p>
<h2 id="定義資源URL">定義資源URL</h2>
<p>由於此版本的LocalLibrary對於最終用戶基本上是只讀的,因此我們只需要提供該網站的登錄頁面(主頁),以及顯示書籍和作者的列表和詳細視圖的頁面。</p>
<p>我們頁面所需的URL是:</p>
<ul>
<li><code>catalog/</code> — 主頁/索引頁面。</li>
<li><code>catalog/books/</code> — 所有書籍的清單。</li>
<li><code>catalog/authors/</code> — 所有作者列表。</li>
<li><code>catalog/book/<em><id></em></code> — 特定書的詳細信息視圖,其主鍵為 <code><em><id></em></code> (the default)。 因此,例如<code>/catalog/book/3</code>,作為添加的第三本書。</li>
<li><code>catalog/author/<em><id></em></code><em> </em>— 特定作者的詳細信息視圖,其主鍵字段名為<em><code><id></code></em>。 例如,為第11位作者添加了<code>/catalog/author/11</code>。</li>
</ul>
<p>前三個URL用於列出索引,書籍和作者。 它們不對任何其他信息進行編碼,並且雖然返回的結果將取決於數據庫中的內容,但為獲取信息而運行的查詢將始終相同。</p>
<p>相比之下,最後兩個URL用於顯示有關特定書籍或作者的詳細信息-這些URL編碼要顯示在URL中的項目的標識(如上顯示為<id>)。 URL映射器可以提取編碼信息並將其傳遞給視圖,然後將動態確定從數據庫中獲取哪些信息。 通過在我們的URL中編碼信息,我們只需要一個URL映射,視圖和模板即可處理每本書(或作者)。</p>
<div class="note">
<p>注意: Django允許您以自己喜歡的任何方式來構造URL-您可以如上所示在URL主體中編碼信息或使用URL <code>GET</code> 參數(例如<code>/book/?id=6</code>)。 無論使用哪種方法,都應保持URL的整潔,邏輯和可讀性(<a href="https://www.w3.org/Provider/Style/URI">在此處查看W3C建議</a>).</p>
<p>Django文檔傾向於建議在URL正文中編碼信息,他們認為這種做法鼓勵更好的URL設計。</p>
</div>
<p>如概述中所述,本文的其餘部分描述瞭如何構造索引頁。</p>
<h2 id="創建索引頁面">創建索引頁面</h2>
<p>我們將創建的第一頁是索引頁 (<code>catalog/</code>)。 這將顯示一些靜態HTML,以及數據庫中不同記錄的一些計算出的“計數”。 為了完成這項工作,我們必須創建一個URL映射,視圖和模板。</p>
<div class="note">
<p><strong>注意:值得在本節中多加註意。 大多數材料是所有頁面共有的。</strong></p>
</div>
<h3 id="URL_mapping">URL mapping</h3>
<p>創建<a href="/en-US/docs/Learn/Server-side/Django/skeleton_website">skeleton website</a> 時,我們更新了<strong>locallibrary/urls.py</strong>文件,以確保每當收到以 <code>catalog/</code> 開頭的URL時, <em>URLConf </em>模組 <code>catalog.urls</code> 都將處理其餘的子字符串。</p>
<p>來自 <strong>locallibrary/urls.py</strong>的以下代碼片段包括<code>catalog.urls</code> 模塊:</p>
<pre>urlpatterns += [
path('catalog/', include('catalog.urls')),
]
</pre>
<div class="note">
<p><strong>注意</strong>: 每當Django遇到導入函數 <code><a href="https://docs.djangoproject.com/en/2.1/ref/urls/#django.urls.include" title="django.conf.urls.include">django.urls.include()</a></code>時,它都會在指定的結束字符處分割URL字符串,並將剩餘的子字符串發送到所包含的<em>URLconf</em> 模塊以進行進一步處理。</p>
</div>
<p>我們還為<em>URLConf </em>模塊創建了一個佔位符文件,名為 <strong>/catalog/urls.py</strong>。 將以下行添加到該文件:</p>
<pre class="brush: python">urlpatterns = [
<strong> path('', views.index, name='index'),</strong>
]</pre>
<p><code>path()</code>函數定義以下內容:</p>
<ul>
<li>URL模式,它是一個空字符串:<code>''</code>。 處理其他視圖時,我們將詳細討論URL模式。</li>
<li>如果檢測到URL模式,將調用一個視圖函數:<code>views.index</code>, 它是<strong>views.py</strong>文件中名為<code>index()</code> 的函數。 </li>
</ul>
<p><code>path()</code> 函數還指定一個<code>name</code>參數,它是此特定URL映射的唯一標識符。 您可以使用該名稱來“反向”映射器,即,動態創建指向映射器旨在處理的資源的URL。 例如,通過在模板中添加以下鏈接,我們可以使用name參數從任何其他頁面鏈接到我們的主頁:</p>
<pre class="brush: html"><a href="<strong>{% url 'index' %}</strong>">Home</a>.</pre>
<div class="note">
<p><strong>注意</strong>: 我們可以對上面的鏈接進行硬編碼 (例如<code><a href="<strong>/catalog/</strong>">Home</a></code>), 但是如果我們更改主頁的模式 (例如更改為 <code>/catalog/index</code>) 則模板將不再 正確鏈接。 使用反向URL映射更加靈活和健壯!</p>
</div>
<h3 id="View_function-based">View (function-based)</h3>
<p>View是一個用來處理 HTTP 請求的函式,根據需求從資料庫取得資料,通過使用 HTML 模板呈現此數據來生成 HTML , 並且在一個 HTTP 回應中返回 HTML 來呈現給用戶。Index view 遵循這個模型 — 獲取有關數據庫中有多少 <code>Book</code>, <code>BookInstance</code>, 可用的 <code>BookInstance</code> 還有 <code>Author</code> 的訊息, 然後把他們傳遞給模板進行顯示。</p>
<p>打開<strong>catalog/views.py</strong>, 並且注意該文件已經導入 <a href="https://docs.djangoproject.com/en/2.0/topics/http/shortcuts/#django.shortcuts.render">render()</a> 快捷功能已使用模板和數據生成HTML文件。 </p>
<pre class="brush: python">from django.shortcuts import render
# Create your views here.
</pre>
<p>將以下代碼複製到文件底部。 第一行導入將用於訪問所有視圖中的數據的模型類。</p>
<pre class="brush: python">from .models import Book, Author, BookInstance, Genre
def index(request):
"""View function for home page of site."""
# Generate counts of some of the main objects
num_books = Book.objects.all().count()
num_instances = BookInstance.objects.all().count()
# Available books (status = 'a')
num_instances_available = BookInstance.objects.filter(status__exact='a').count()
# The 'all()' is implied by default.
num_authors = Author.objects.count()
context = {
'num_books': num_books,
'num_instances': num_instances,
'num_instances_available': num_instances_available,
'num_authors': num_authors,
}
# Render the HTML template index.html with the data in the context variable
return render(request, 'index.html', context=context)</pre>
<p>視圖函數的第一部分使用模型類上的 <code>objects.all()</code> 屬性獲取記錄數。 它還獲取具有狀態字段值為“ a”(可用)的<code>BookInstance</code> 物件列表。 在上一教程(<a href="/en-US/docs/Learn/Server-side/Django/Models#Searching_for_records">Django Tutorial Part 3: Using models > Searching for records</a>)中,您可以找到更多有關如何從模型進行訪問的信息。.</p>
<p>在函數的最後,我們調用 <code>render()</code> 函數來創建並返回HTML頁面作為響應(此快捷功能包裝了許多其他函數,從而簡化了這種非常常見的用例)。它以原始 <code>request</code> 物件 (一個 <code>HttpRequest</code>), 帶有數據佔位符的HTML模板以及上下文 <code>context</code> 變量包含將插入到這些佔位符中的數據的Python字典)為參數。</p>
<p>在下一節中,我們將詳細討論模板和上下文變量。 讓我們開始創建模板,以便實際上可以向用戶顯示內容!</p>
<h3 id="Template">Template</h3>
<p>模板是一個文本文件,用於定義文件(例如HTML頁面)的結構或佈局,並使用佔位符表示實際內容。 Django會在您的應用程序名為'<strong>templates</strong>'的目錄中自動查找模板。 因此,例如,在我們剛剛添加的索引視圖中, <code>render()</code> 函數將有望能夠找到文件 <strong>/locallibrary/catalog/templates/<em>index.html</em></strong>,如果找不到該文件,則會引發錯誤。 如果您保存以前的更改並返回瀏覽器,則可以看到此信息-訪問<code>127.0.0.1:8000</code>現在將為您提供一個相當直觀的錯誤消息"<code>TemplateDoesNotExist at /catalog/</code>"以及其他詳細信息。</p>
<div class="note">
<p><strong>注意</strong>: Django將根據項目的設置文件在許多位置查找模板(搜索已安裝的應用程序是默認設置!)。 您可以在 <a href="https://docs.djangoproject.com/en/2.0/topics/templates/">Templates</a> (Django docs)中找到有關Django如何查找模板及其支持的模板格式的更多信息。</p>
</div>
<h4 id="Extending_templates">Extending templates</h4>
<p>索引模板的頭部和身體將需要標準的HTML標記,以及用於導航的部分(到我們尚未創建的站點中的其他頁面)以及用於顯示一些介紹性文本和我們的書籍數據的部分。 對於我們網站上的每個頁面,大部分文本(HTML和導航結構)都是相同的。 Django模板語言允許您聲明一個基本模板,然後擴展它,而不是強迫開發人員在每個頁面中都複製此"樣板" ,只需替換每個特定頁面上不同的部分即可。</p>
<p>例如,基本模板 <strong>base_generic.html</strong> 可能類似於以下文本。 如您所見,其中包含一些"通用" HTML以及標題,側邊欄和內容的部分,這些部分使用命名的<code>block</code> 和<code>endblock</code> 模板標記進行了標記(以粗體顯示)。 區塊可以為空,或包含將在默認情況下用於派生頁面的內容。</p>
<div class="note">
<p><strong>注意</strong>:模板<em>tags</em> 類似於可以在模板中使用的功能,可以在模板中循環使用列表,基於變量的值執行條件操作等。除了模板標記之外,模板語法還允許您引用模板變量(傳遞給 模板),並使用<em>template filters</em>,該過濾器可重新格式化變量(例如,將字符串設置為小寫)。</p>
</div>
<pre class="brush: html"><!DOCTYPE html>
<html lang="en">
<head>
<strong>{% block title %}</strong><title>Local Library</title><strong>{% endblock %}</strong>
</head>
<body>
<strong>{% block sidebar %}</strong><!-- insert default navigation text for every page --><strong>{% endblock %}</strong>
<strong>{% block content %}</strong><!-- default content text (typically empty) --><strong>{% endblock %}</strong>
</body>
</html>
</pre>
<p>當我們想為特定視圖定義模板時,我們首先指定基本模板(帶有<code>extends</code> 模板標籤-請參見下一個代碼清單)。 如果我們要在模板中替換任何節,則使用與基本模板中相同的<code>block</code>/<code>endblock</code>節來聲明這些節。</p>
<p>例如,下面的代碼片段顯示了我們如何使用<code>extends</code> 模板標籤並覆蓋<code>content</code> 區塊。 生成的最終HTML將具有基本模板中定義的所有HTML和結構(包括您在<code>title</code> 區塊中定義的默認內容),但是將新的<code>content</code> 區塊插入到默認模板中。</p>
<pre class="brush: html">{% extends "base_generic.html" %}
{% block content %}
<h1>Local Library Home</h1>
<p>Welcome to LocalLibrary, a website developed by <em>Mozilla Developer Network</em>!</p>
{% endblock %}</pre>
<h4 id="The_LocalLibrary_base_template">The LocalLibrary base template</h4>
<p>下面列出了我們計劃用於<em>LocalLibrary</em> 網站的基本模板。 如您所見,其中包含一些HTML以及 <code>title</code>, <code>sidebar</code>, 和 <code>content</code>。 我們有一個默認標題(我們可能想要更改)和一個默認側邊欄,其中帶有指向所有書籍和作者列表的鏈接(我們可能不想更改,但是如果需要的話,我們允許範圍通過將其放在 在一個區塊中)。</p>
<div class="note">
<p><strong>注意</strong>: 我們還引入了兩個附加的模板標籤:<code>url</code> 和<code>load static</code>。 這些將在以下各節中討論。</p>
</div>
<p>創建一個新文件<strong>/locallibrary/catalog/templates/<em>base_generic.html</em></strong> ,並為其提供以下內容:</p>
<pre class="brush: html"><!DOCTYPE html>
<html lang="en">
<head>
{% block title %}<title>Local Library</title>{% endblock %}
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<!-- Add additional CSS in static file -->
{% load static %}
<link rel="stylesheet" href="{% static 'css/styles.css' %}">
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-sm-2">
{% block sidebar %}
<ul class="sidebar-nav">
<li><a href="{% url 'index' %}">Home</a></li>
<li><a href="">All books</a></li>
<li><a href="">All authors</a></li>
</ul>
{% endblock %}
</div>
<div class="col-sm-10 ">
{% block content %}{% endblock %}
</div>
</div>
</div>
</body>
</html></pre>
<p>該模板包括來自<a href="http://getbootstrap.com/">Bootstrap</a>的CSS,以改進HTML頁面的佈局和表示方式。 使用Bootstrap或其他客戶端Web框架是創建吸引人的頁面的快速方法,該頁面可以在不同的瀏覽器大小上很好地擴展。</p>
<p>基本模板還引用了本地CSS文件 (<strong>styles.css</strong>) ,該文件提供了一些其他樣式。 創建 <strong>/locallibrary/catalog/static/css/styles.css</strong>並為其提供以下內容:</p>
<pre class="brush: css">.sidebar-nav {
margin-top: 20px;
padding: 0;
list-style: none;
}</pre>
<h4 id="The_index_template">The index template</h4>
<p>創建HTML文件 <strong>/locallibrary/catalog/templates/<em>index.html</em></strong> 並為其提供以下內容。 如您所見,我們在第一行中擴展了基本模板,然後使用該模板的新內容塊替換默認<code>content</code> 區塊。</p>
<pre class="brush: html">{% extends "base_generic.html" %}
{% block content %}
<h1>Local Library Home</h1>
<p>Welcome to LocalLibrary, a website developed by <em>Mozilla Developer Network</em>!</p>
<h2>Dynamic content</h2>
<p>The library has the following record counts:</p>
<ul>
<li><strong>Books:</strong> <strong>\{{ num_books }}</strong></li>
<li><strong>Copies:</strong> <strong>\{{ num_instances }}</strong></li>
<li><strong>Copies available:</strong> <strong>\{{ num_instances_available }}</strong></li>
<li><strong>Authors:</strong> <strong>\{{ num_authors }}</strong></li>
</ul>
{% endblock %}</pre>
<p>在 <em>Dynamic content </em>部分中,我們聲明了要從視圖中包含的信息的佔位符(<em>template variables</em>)。 變量使用“雙括號”或“把手”語法標記(請參見上面的粗體)。</p>
<div class="note">
<p><strong>注意</strong>:因為變量具有雙括號 (<code>\{{ num_books }}</code>),而標籤則用百分號括在單括號中擴展為 (<code>{% extends "base_generic.html" %}</code>),所以您可以輕鬆識別是要處理模板變量還是模板標籤(函數)。</p>
</div>
<p>這裡要注意的重要一點是,這些變量是使用我們在視圖的<code>render()</code> 函數中傳遞給<code>context</code> 字典的鍵命名的(請參見下文); 呈現模板時,這些將被其<em>values</em> 替換。</p>
<pre class="brush: python">context = {
'<strong>num_books</strong>': num_books,
'<strong>num_instances</strong>': num_instances,
'<strong>num_instances_available</strong>': num_instances_available,
'<strong>num_authors</strong>': num_authors,
}
return render(request, 'index.html', context=context)</pre>
<h4 id="Referencing_static_files_in_templates">Referencing static files in templates</h4>
<p>您的項目可能會使用靜態資源,包括JavaScript,CSS和圖像。 由於這些文件的位置可能未知(或可能會更改),因此Django允許您相對於<code>STATIC_URL</code> 全局設置在模板中指定這些文件的位置(默認框架網站將<code>STATIC_URL</code> 的值設置為'<code>/static/</code>',但您可以選擇將其託管在內容分發網絡或其他地方)。</p>
<p>在模板中,您首先調用指定為“ static”的<code>load</code> 模板標籤以添加此模板庫(如下所示)。 加載靜態文件後,您可以使用<code>static</code> 模板標籤,指定感興趣文件的相對URL。</p>
<pre class="brush: html"><!-- Add additional CSS in static file -->
{% load static %}
<link rel="stylesheet" href="{% static 'css/styles.css' %}"></pre>
<p>如果需要,您可以以相同的方式將圖像添加到頁面中。 例如:</p>
<pre class="brush: html">{% load static %}
<img src="{% static 'catalog/images/local_library_model_uml.png' %}" alt="UML diagram" style="width:555px;height:540px;">
</pre>
<div class="note">
<p><strong>注意</strong>:上面的更改指定了文件的位置,但是Django默認不提供文件。創建網站框架時 (<a href="/en-US/docs/Learn/Server-side/Django/skeleton_website">created the website skeleton</a>),雖然我們在全局URL映射器(<strong>/locallibrary/locallibrary/urls.py</strong>)中啟用了由開發Web服務器提供的服務,但您仍需要安排它們在生產中提供。 我們待會再看。</p>
</div>
<p>有關使用靜態文件的更多信息,請參閱管理靜態文件 <a href="https://docs.djangoproject.com/en/2.0/howto/static-files/">Managing static files</a> (Django docs)。</p>
<h4 id="Linking_to_URLs">Linking to URLs</h4>
<p>上面的基本模板引入了<code>url</code> 模板標籤。</p>
<pre class="brush: python"><li><a href="{% url 'index' %}">Home</a></li>
</pre>
<p>此標記採用在 <strong>urls.py</strong>中調用的 <code>path()</code>函數的名稱以及關聯視圖將從該函數接收的任何參數的值,並返回可用於鏈接到資源的URL。</p>
<h2 id="What_does_it_look_like">What does it look like?</h2>
<p>此時,我們應該已經創建了顯示索引頁面所需的所有內容。 運行服務器(<code>python3 manage.py runserver</code>),然後打開瀏覽器到<a href="http://127.0.0.1:8000/">http://127.0.0.1:8000/</a>。 如果一切設置正確,則您的站點應類似於以下螢幕截圖。</p>
<p><img alt="Index page for LocalLibrary website" src="https://mdn.mozillademos.org/files/14045/index_page_ok.png" style="border-style: solid; border-width: 1px; display: block; height: 356px; margin: 0px auto; width: 874px;"></p>
<div class="note">
<p><strong>注意</strong>:您將無法使用<strong>All books</strong>和<strong>All authors</strong>鏈接,因為尚未定義這些頁面的路徑,視圖和模板(當前我們僅在<code>base_generic.html</code> html模板中插入了這些鏈接的佔位符)。</p>
</div>
<h2 id="Challenge_yourself">Challenge yourself</h2>
<p>這裡有兩個任務可以測試您對模型查詢,視圖和模板的熟悉程度。</p>
<ol>
<li>LocalLibrary <a href="#The_LocalLibrary_base_template">base template</a> 已定義<code>title</code> 欄。 在 <a href="#The_index_template">index template</a>中覆蓋此塊並為頁面創建一些新標題。
<div class="note">
<p><strong>提示</strong> :<a href="#Extending_templates">Extending templates</a> 部分介紹瞭如何創建塊並將其擴展到另一個模板中。<br>
</p>
</div>
</li>
<li>修改 <a href="#View_(function-based)">view</a>以生成包含特定單詞(不區分大小寫)的流派計數和書籍計數,並將其傳遞給<code>context</code> (這與我們創建並使用<code>num_books</code> 和<code>num_instances_available</code>的方式大致相同)。 然後更新 <a href="#The_index_template">index template</a> 以使用這些變量。</li>
</ol>
<ul>
</ul>
<h2 id="Summary">Summary</h2>
<p>現在,我們已經為網站創建了主頁-一個HTML頁面,該頁面顯示了數據庫中的一些記錄計數,並具有指向其他尚待創建頁面的鏈接。 在此過程中,我們學習了很多有關url映射器,視圖,使用我們的模型查詢數據庫,如何從視圖中將信息傳遞到模板以及如何創建和擴展模板的基本信息。</p>
<p>在下一篇文章中,我們將基於我們的知識來創建其他四個頁面。</p>
<h2 id="See_also">See also</h2>
<ul>
<li><a href="https://docs.djangoproject.com/en/2.0/intro/tutorial03/">Writing your first Django app, part 3: Views and Templates</a> (Django docs)</li>
<li><a href="https://docs.djangoproject.com/en/2.0/topics/http/urls/">URL dispatcher</a> (Django docs)</li>
<li><a href="https://docs.djangoproject.com/en/2.0/topics/http/views/">View functions</a> (DJango docs)</li>
<li><a href="https://docs.djangoproject.com/en/2.0/topics/templates/">Templates</a> (Django docs)</li>
<li><a href="https://docs.djangoproject.com/en/2.0/howto/static-files/">Managing static files</a> (Django docs)</li>
<li><a href="https://docs.djangoproject.com/en/2.0/topics/http/shortcuts/#django.shortcuts.render">Django shortcut functions</a> (Django docs)</li>
</ul>
<p>{{PreviousMenuNext("Learn/Server-side/Django/Admin_site", "Learn/Server-side/Django/Generic_views", "Learn/Server-side/Django")}}</p>
<h2 id="In_this_module">In this module</h2>
<ul>
<li><a href="/en-US/docs/Learn/Server-side/Django/Introduction">Django introduction</a></li>
<li><a href="/en-US/docs/Learn/Server-side/Django/development_environment">Setting up a Django development environment</a></li>
<li><a href="/en-US/docs/Learn/Server-side/Django/Tutorial_local_library_website">Django Tutorial: The Local Library website</a></li>
<li><a href="/en-US/docs/Learn/Server-side/Django/skeleton_website">Django Tutorial Part 2: Creating a skeleton website</a></li>
<li><a href="/en-US/docs/Learn/Server-side/Django/Models">Django Tutorial Part 3: Using models</a></li>
<li><a href="/en-US/docs/Learn/Server-side/Django/Admin_site">Django Tutorial Part 4: Django admin site</a></li>
<li><a href="/en-US/docs/Learn/Server-side/Django/Home_page">Django Tutorial Part 5: Creating our home page</a></li>
<li><a href="/en-US/docs/Learn/Server-side/Django/Generic_views">Django Tutorial Part 6: Generic list and detail views</a></li>
<li><a href="/en-US/docs/Learn/Server-side/Django/Sessions">Django Tutorial Part 7: Sessions framework</a></li>
<li><a href="/en-US/docs/Learn/Server-side/Django/Authentication">Django Tutorial Part 8: User authentication and permissions</a></li>
<li><a href="/en-US/docs/Learn/Server-side/Django/Forms">Django Tutorial Part 9: Working with forms</a></li>
<li><a href="/en-US/docs/Learn/Server-side/Django/Testing">Django Tutorial Part 10: Testing a Django web application</a></li>
<li><a href="/en-US/docs/Learn/Server-side/Django/Deployment">Django Tutorial Part 11: Deploying Django to production</a></li>
<li><a href="/en-US/docs/Learn/Server-side/Django/web_application_security">Django web application security</a></li>
<li><a href="/en-US/docs/Learn/Server-side/Django/django_assessment_blog">DIY Django mini blog</a></li>
</ul>
|