1. 程式人生 > >python程式設計從入門到實踐18章 Django入門

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預設方法與普通方法發生名稱衝突