# 昨日知識點回顧
? ? ? ? 定義、遷移模型Entry
# 今日知識點學習
? ? ? ? 18.2.7 Django shell????????
?????????每次修改模型后,看到重啟后的效果需要重啟shell,退出shell會話Windows系統按ctrl+Z或者輸入exit()
18.3 創建頁面:學習筆記主頁
? ? ? ? 創建頁面三階段:定義URL,編寫視圖和編寫模版
? ? ? ? 18.3.1 映射URL????????
# learning_log\urls.py
from django.contrib import admin
from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('', include('learning_logs.urls'))
]
# learning_logs\urls.py
"""定義learining——logs的URL模式。"""
# 為映射視圖,導入path
from django.urls import path
# 從當前文件夾引入view.py
from . import views
# app_name 區分同項目同名文件
app_name = 'learning_logs'# urlpatterns包含learning_logs中請求的頁面
urlpatterns = [# 主頁path('', views.index, name='index'),# 第一個幫助Django正確路由請求,空字符串與基礎URL匹配,第二個實參指定調用函數,第三個指定URL模式名稱指定為index
]
? ? ? ? 18.3.2 編寫視圖
# learning\views.py
from django.shortcuts import render# Create your views here.
def index(request):"""學習筆記的主頁"""# 傳遞兩個實參:對象request以及一個可用于創建頁面的模版return render(request, 'learning_logs/index.html')
? ? ? ? 18.3.3 編寫模版?
# learning_log\learning_logs\templates\learning_logs\index.html
# <p>段落開始、</p>段落結束
<p>Learning Logs</p><p>Learning Log helps you keep track of your learning, for any topic you're learning about.</p>
?????????瀏覽器網址localhost:8000運行顯示結果:
? ? ? ? ?python manage.py runserver的終端窗口按ctrl+c停用服務器
18.4 創建其他頁面
? ? ? ? 創建兩個顯示數據的頁面:①列出所有主題;②顯示特定主題的所有條目?
? ? ? ? 在此之前,創建一個父模版,項目其他模版都繼承它。
? ? ? ? 18.4.1 模版繼承
? ? ? ? ????????1.父模版
# learning_log\learning_logs\templates\learning_logs\base.html
# 模版標簽{% %}:生成一個與learning——logs/urls.py定義中的'index'URL模式相匹配的URL
# learning_logs是一個命名空間,index是該命名空間中一個名稱獨特的URL模式
<p><a href = "{% url 'learning_logs:index' %}">Learning Log</a>
</p>
# 插入塊標簽,塊名content,是一個占位符,包含信息由子模塊指定
{% block content %}{% endblock content %}
? ? ? ? ? ? ? ? 在簡單的HTML頁面中,鏈接是使用錨標簽<a>定義的:
<a href = "link_url">link text</a>
? ? ? ? ? ? ? ? 2.子模塊????????
#
# 子模塊第一行必須包含標簽{% extends %},讓Django知道繼承了哪個父模塊
{% extends "learning_logs/base.html" %}# 插入名為content的{% block %}標簽,定義content塊
{% block content %}
<p>Learning Log helps you keep track of your learning, for any topic you're learning about.</p>
# 標簽{% endblock content %}指定內容定義結束位置
{% endblock content %}
? ? ? ? ?18.4.2 顯示所有主題的頁面
? ? ? ????????? 1.URL模式
# learning_logs/urls.py
"""定義learining——logs的URL模式。"""
# 為映射視圖,導入path
from django.urls import path
# 從當前文件夾引入view.py
from . import views
# app_name 區分同項目同名文件
app_name = 'learning_logs'# urlpatterns包含learning_logs中請求的頁面
urlpatterns = [# 主頁path('', views.index, name='index'),# 第一個幫助Django正確路由請求,空字符串與基礎URL匹配,第二個實參指定調用函數,第三個指定URL模式名稱指定為index# 顯示所有的主題path('topics/', views.topics, name='topics')
]
? ? ? ? ? ? ? ? 2.視圖
# views.py
from django.shortcuts import render# 導入所需數據相關聯的模型
from .models import Topic# Create your views here.
def index(request):"""學習筆記的主頁"""# 傳遞兩個實參:對象request以及一個可用于創建頁面的模版return render(request, 'learning_logs/index.html')def topics(request):"""顯示所有的主題"""topics = Topic.objects.order_by('date_added')# 定義一個將要發送模版的上下文context = {'topics': topics}return render(request, 'learning_logs/topics.html', context)
? ? ? ? 3.模塊
# learning_log\learning_logs\templates\learning_logs\topics.html
# 繼承base.html
{% extends "learning_logs/base.html" %}
# 標準HTML中,項目列表稱為無序列表,用<ul></ul>表示
{% block content %}<p>Topics</p>
# 所有主題的項目列表始于<ul>處<ul>
# 循環:{% for item in list %}{% endfor %}{% for topic in topics %}
# HTML標簽<li></li>之間的內容表示一個項目列表項<li>{{ topic }}</li>
# {% empty %}告訴Django在列表topics為空時該怎么辦{% empty %}<li>No topics have been added yet.</li>{% endfor %}</ul>
{% endblock content %}
?????????瀏覽器輸入網址localhost:8000/topics/顯示:
? ? ? ? 18.4.3 顯示特定主題的頁面
? ? ? ? ????????1.URL模式
"""定義learining——logs的URL模式。"""
# 為映射視圖,導入path
from django.urls import path
# 從當前文件夾引入view.py
from . import views
# app_name 區分同項目同名文件
app_name = 'learning_logs'# urlpatterns包含learning_logs中請求的頁面
urlpatterns = [# 主頁path('', views.index, name='index'),# 第一個幫助Django正確路由請求,空字符串與基礎URL匹配,第二個實參指定調用函數,第三個指定URL模式名稱指定為index# 顯示所有的主題path('topics/', views.topics, name='topics'),# 特定主題的詳細頁面path('topics/<int:topic_id>/', views.topic, name='topic')
]
? ? ? ? ?2.視圖
# views.py
from django.shortcuts import render# 導入所需數據相關聯的模型
from .models import Topic# Create your views here.
def index(request):"""學習筆記的主頁"""# 傳遞兩個實參:對象request以及一個可用于創建頁面的模版return render(request, 'learning_logs/index.html')def topics(request):"""顯示所有的主題"""topics = Topic.objects.order_by('date_added')# 定義一個將要發送模版的上下文context = {'topics': topics}return render(request, 'learning_logs/topics.html', context)def topic(request, topic_id):"""顯示單個主題"及所有的條目"""topic = Topic.objects.get('id=topic_id')entries = topic.entry_set.order_by('-date_added')context = {'topic': topic, 'entries': entries}return render(request, 'learning_logs/topic.html', context)
? ? ? ? 3. 模版
# topic.html
{% extends 'learning_logs/base.html' %}{% block content %}<p>Topic: {{ topic }}</p><p>Entries:</p><ul>{% for entry in entries %}<li>
# Django中豎線(|)表示模版過濾器,即對模版變量的值進行修改的函數<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 %}
? ? ? ? 4.將顯示所有主題的頁面中的主題設置為鏈接
# topics.html
{% 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>
{% endblock content %}
? ? ? ? ? ? ? ? ?瀏覽器輸入ValueError at /topics/2/顯示結果: