python程式設計從入門到實踐18章 Django入門
python3.6
Django2.0.1
1. 模板繼承
建立一個base.html,其他的模板都繼承這個父模板。<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a>
</p>
{% block content %}{% endblock content %}
</body>
</html>
{% url 'learning_logs:index' %}
表示在名稱空間learning_logs下的名為index的地址。
index是在/learning_logs/urls.py中的urlpatterns中定義的
{% block content %}{% endblock content %}
這是一個塊標籤,
表示一個名為content的塊,
其中的內容需要由子模組指定。
可以在base.html中定義多個塊,但是子模組可以只指定其中的一個或幾個,不是必須全部指定。
現在重新編寫index.html以繼承base.html
原內容為:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Home</title>
</head>
<body>
<p>Learning Log</p>
<p>Learning Log helps you keep track of your learning,
for any topic you're learning about.</p>
</body>
</html>
把
<p>Learning Log</p>
<p>Learning Log helps you keep track of your learning,
for any topic you're learning about.</p>
改為:
{% extends "learning_logs/base.html" %}{% block content %}
<p>Learning Log helps you keep track of your learning,
for any topic you're learning about.</p>
{% endblock content %}
這樣,父模板中的內容就被繼承過來,其中
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a>
</p>
將直接顯示,
而
{% block content %}{% endblock content %}
需要子模板定義。
2. 新增頁面
修改learning_logs/urls.py
"""define url mode of learning_logs"""
from django.urls import path, re_path
from . import views
urlpatterns = [
# home
path('', views.index, name='index'),
# topics
path('topics/', views.topics, name='topics'),
]
app_name = 'learning_logs'
添加了path('topics/', views.topics, name='topics'),
現在localhost:port/topics/得到了匹配,訪問這個地址時,將呼叫views.py中的topics函式;在其他地方也可以引用別名topics來訪問這個url
下面在檢視views.py中匯入Topic類,並建立topics函式:
from django.shortcuts import render
# import class "Topic" from ./models.py
from .models import Topic
# Create your views here.
def index(request):
"""home page of learning log"""
return render(request, 'learning_logs/index.html')
def topics(request):
"""show all topics"""
topics = Topic.objects.order_by('date_added')
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)
context = {'topics': topics}
定義了一個上下文,它是一個字典。這個上下文馬上會通過render
傳送到learning_logs/topics.html
中,用於資料的操作。
下面建立topics.html
{% extends "learning_logs/base.html" %}{% block content %}
<p>Topics</p>
<ul>
{% for topic in topics %}
<li>
{{ topic }}
</li>
{% empty %}
<li>No topics have been added yet.</li>
{% endfor %}
</ul>
{% endblock content %}
{% empty %}
表示:如果topics為空的話,如何處理
現在父模板base.html如下:
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a>
</p>
{% block content %}{% endblock content %}
目前只有主頁的連結,下面新增topics頁面的連結,使得任何一個繼承base.html的頁面,都顯示指向主頁index
和主題頁topics
的連結,亦即localhost:port/
和localhost:port/topics
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a>
-
<a href="{% url 'learning_logs:topics' %}">Topics</a>
</p>
{% block content %}{% endblock content %}
以上實現了主題頁的顯示,該頁列出所有主題,下面繼續建立單個主題的頁面,在這個頁面中,將顯示有關這個主題的所有話題。
現在要實現這樣的訪問,例如:
localhost:port/topics/1/
即訪問主題id為1的主題。
為此,在learning_logs/urls.py中的urlpatterns中新增:
# specified topic detail
re_path('topics/(?P<topic_id>\d+)/', views.topic, name='topic'),
/(?P<topic_id>\d+)/
的兩端是兩個斜槓,舉慄說,他們匹配localhost:port/topics/1/中的1,並且把1儲存在topic_id中。
具體地,兩邊的括號()捕獲url中的值,?P<topic_id>
把匹配的值存到topic_id中,\d+
表示匹配任何位數的數字。
如果url匹配了,django就呼叫views.py中的topic函式,並把topic_id中的值作為實參傳遞給它。
現在,建立檢視函式topic()
在views.py
中新增:
def topic(request, topic_id):
"""show one topic with its all entry"""
topic = Topic.objects.get(id=topic_id)
# minus sign indicates descending sort
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'learning_logs/topic.html', context)
注意這個函式包含一個形參topic_id
, -date_added
前的減號表示降序排列,
把主題和條目都存在context字典中,
把上下文context
傳遞給topic.html
下面編寫具體主題頁的模板:
{% extends 'learning_logs/base.html' %}{% block content %}
<p>Topic: {{ topic }}</p>
<p>Entries</p>
<ul>
{% for entry in entries %}
<li>
<p>{{ entry.date_added|date:'M d, Y H:i' }}</p>
<p>{{ entry.text|linebreaks }}</p>
</li>
{% empty %}
<li>
There are no entries for this topic yet.
</li>
{% endfor %}
</ul>
{% endblock content %}
<p>Topic: {{ topic }}</p>
中的topic
和{% for entry in entries %}
中的entries
來自context
上下文,是剛剛由render函式傳遞過來的。
<p>{{ entry.date_added|date:'M d, Y H:i' }}</p>
<p>{{ entry.text|linebreaks }}</p>
豎線|表示模板過濾器
最後,修改topics.html
,把{{ topic }}
修改為<a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
讓每個主題都成為連結,連結到相應的主題詳情頁面
{% extends "learning_logs/base.html" %}{% block content %}
<p>Topics</p>
<ul>
{% for topic in topics %}
<li>
<a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
</li>
{% empty %}
<li>No topics have been added yet.</li>
{% endfor %}
</ul>
<a href="{% url 'learning_logs:new_topic' %}">Add a new topic:</a>
{% endblock content %}
然後輸入http://localhost:8000
點選topic:
點選Chess:
點選Rock Climbing:
另外注意:當你修改內容的時候,先把終端關閉 ,然後重新啟動 ,然後再重新整理瀏覽器 , 不然會出現錯誤!
相關推薦
python程式設計從入門到實踐18章 Django入門
python3.6 Django2.0.11. 模板繼承 建立一個base.html,其他的模板都繼承這個父模板。<!DOCTYPE html> <html lang="en"> <head> <meta charset="
《python 程式設計 從入門到實踐》-第十八章Django入門,專案3 遇到的問題。
第十八章Django入門,很多小白在按照書本上的內容按部就班的進行Django的入門學習時發現,在學習前兩個部分的時候,一切都是很順利。到了第三個專案,建立網頁:學習筆記主頁,將Django主頁URL對映到自己要設計的學習筆記主頁時,一直出現錯誤,沒有匹配的UR
python程式設計:從入門到實踐學習筆記-Django入門(四)
建立其他網頁 我們接下來擴充“學習筆記”專案,建立兩個顯示資料的網頁,其中一個列出所有的主題,另一個顯示特定主題的所有條目。 模板繼承 編寫一個包含通用元素的父模板,並讓每個網頁都繼承這個模板,而不必在每個網頁中重複定義這些通用元素。這樣我們可以專注於開發每個網頁的獨特部分。1.父模板
python程式設計:從入門到實踐學習筆記-Django入門(二)
建立網頁:學習筆記主頁 使用django建立網頁通常分三個階段:定義URL、編寫檢視和編寫模板。 首先必須定義URL模式,其描述了URL是如何設計的,讓django知道如何將瀏覽器請求與網站URL匹配,以確定返回哪個網頁。每個URL都被對映到特定的檢視——檢視函式獲取並處理網頁所需的資料。檢視函
python程式設計:從入門到實踐學習筆記Django入門(一)
建立應用程式 django專案由一系列應用程式組成,他們協同工作,讓專案稱謂一個整體。首先我們執行命令python manage.py startapp learning_logs。 定義模型 開啟剛剛我們建立的資料夾,並修改mod
python 程式設計從入門到實踐 第二章 變數和簡單資料型別
-- 變數 message = "hello python word" print(message) -- 練習 vi simple_message.py #!/usr
python 程式設計從入門到實踐 第一章 起步
1 搭建程式設計環境 -- 安裝 Python3 yum -y install python3* -- 安裝過程中遇到報錯 說明已經安裝了Python34 --> Finish
Python程式設計從入門到實踐課後答案:第九章
9-1 餐館 :建立一個名為Restaurant 的類,其方法__init__() 設定兩個屬性:restaurant_name 和cuisine_type 。建立一個名 為describe_restaurant() 的方法和一個名為open_restaurant() 的方法,其中前者列印前
Python程式設計從入門到實踐課後答案:第八章
8-1 訊息 :編寫一個名為display_message() 的函式,它列印一個句子,指出你在本章學的是什麼。呼叫這個函式,確認顯示的訊息正確無誤。 8-2 喜歡的圖書 :編寫一個名為favorite_book() 的函式,其中包含一個名為title 的形參。這個函式列印一條訊息,如One
Python程式設計從入門到實踐課後答案:第六章
6-1 人 :使用一個字典來儲存一個熟人的資訊,包括名、姓、年齡和居住的城市。該字典應包含鍵first_name 、last_name 、age 和city 。將儲存在該字典中 的每項資訊都打印出來。 data = {"first_name": "鄭", "last_name": "超"
Python程式設計從入門到實踐課後答案:第五章
5-3 外星人顏色#1 :假設在遊戲中剛射殺了一個外星人,請建立一個名為alien_color 的變數,並將其設定為’green’ 、‘yellow’ 或’red’ 。 編寫一條if 語句,檢查外星人是否是綠色的;如果是,就列印一條訊息,指出玩家獲得了5個點。 編寫這個程式的兩個版本,在一個
Python程式設計從入門到實踐課後答案:第四章
4-1 比薩 :想出至少三種你喜歡的比薩,將其名稱儲存在一個列表中,再使用for 迴圈將每種比薩的名稱都打印出來。 修改這個for 迴圈,使其列印包含比薩名稱的句子,而不僅僅是比薩的名稱。對於每種比薩,都顯示一行輸出,如“I like pepperoni pizza”。 在程式末尾新增一行程
Python程式設計從入門到實踐課後答案:第三章
3-1 姓名: 將一些朋友的姓名儲存在一個列表中,並將其命名為names 。依次訪問該列表中的每個元素,從而將每個朋友的姓名都打印出來。 names = ["Tom", "Bob", "Jack"] for i in names: print(i) 3-2 問候語: 繼續使用練習
《Python程式設計從入門到實踐》第9章類課後習題(附程式碼)
目錄 9-1(9-2) 餐館 9-3 使用者 9-4 就餐人數 9-5 嘗試登陸次數 9-6 冰淇淋小店 9-7 管理員 9-8 許可權 9-10 匯入Restaurant類 9-11 匯入Admin類 9-12 多個模組 9-1(9-2) 餐館
Python程式設計從入門到實踐課後答案:第十一章
11-1 城市和國家 :編寫一個函式,它接受兩個形參:一個城市名和一個國家名。這個函式返回一個格式為City, Country 的字串,如Santiago, Chile 。將 這個函式儲存在一個名為city_functions.py的模組中。 建立一個名為test_cities.py的程式,
Python程式設計從入門到實踐課後答案:第十章
10-1 Python學習筆記 :在文字編輯器中新建一個檔案,寫幾句話來總結一下你至此學到的Python知識,其中每一行都以“In Python you can”打頭。將這個檔案命名為 learning_python.txt,並將其儲存到為完成本章練習而編寫的程式所在的目錄中。編寫一個程式,
《Python程式設計從入門到實踐》第10章檔案和異常動手試一試答案(附程式碼)
目錄 10-3 訪客 10-4 訪客名單 10-6 加法運算 10-7 加法計算器 10-8 貓和狗 10-9 沉默的貓和狗 10-3 訪客 #!/usr/bin/env python # -*- coding:utf-8 -*- user = input
python程式設計 從入門到實踐 第六章 字典
學習筆記: # 一個簡單的字典 alien_0={'color':'green','points':'5'} print(alien_0['color']) print(alien_0['points']) #6.2 使用字典 ## 字典是一系列鍵—值對,每個鍵都有一個值
《Python程式設計從入門到實踐》第8章 函式
第8章 函式 只記錄了自己以前沒有注意到的知識點 一、傳遞實參 向函式傳遞實參的方式有很多種,可以使用位置實參,這要求實參的順序和形參的順序相同;也可以使用關鍵字實參,其中的每個實參都是由變數名和實參組成,還可以使用字典和列表 1. 位置實參 基於實
《Python程式設計從入門到實踐》第9章 類
第9章 類 只記錄了自己以前沒有注意到的知識點 1.方法__init__() 這是一個特殊的方法,當你建立例項的時候,Python會自動執行它。在這個方法的名稱中,開頭和末尾各有兩個下劃線,這是一種約定,旨在避免Python預設方法與普通方法發生名稱衝突