Django Web應用程序(三)

18.3 創(chuàng)建網(wǎng)頁: 學習筆記主頁

使用Django創(chuàng)建網(wǎng)頁的過程通常分為三個階段: 定義URL森篷、編寫視圖和編寫模板谈飒。
URL模式描述了URL是如何設(shè)計的艰额,讓Django知道如何將瀏覽器請求與網(wǎng)站URL匹配臂港,以確定返回哪個網(wǎng)頁卿捎。
每個URL都被映射到特定的視圖——視圖函數(shù)獲取并處理網(wǎng)頁所需的數(shù)據(jù)莱衩。視圖函數(shù)通常調(diào)用一個模板,后者生成瀏覽器能夠理解的網(wǎng)頁娇澎。

18.3.1 映射URL

用戶通過在瀏覽器中輸入URL以及單擊鏈接來請求網(wǎng)頁笨蚁,因此我們需要確定項目需要哪些URL。主頁URL最重要趟庄,它是用戶用來訪問項目的基礎(chǔ)URL括细。當前,基礎(chǔ)URL(http://localhost:8000/)返回默認Django網(wǎng)頁
修改文件夾learning_log中的文件urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import include,url

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'', include('learning_logs.urls', namespace='learning_logs')),
]

這是一個針對整個項目的urls.py文件戚啥,變量urlpatterns 包含項目中的應用程序的URL奋单。添加一行代碼來包含模塊learning_logs.urls,這行代碼包含實參namespace, 可以讓我們將learning_logs的URL同項目中的其他URL區(qū)分開

創(chuàng)建learning_logs的urls.py文件

"""定義learning_logs的URL模式"""
from django.conf.urls import url

from . import views

app_name = 'learning_logs'

urlpatterns = [
    url(r'^$', views.index, name='index'),
]

url的第二個實參指定了要調(diào)用的視圖函數(shù)猫十。請求的URL于前述正則表達式匹配時览濒,Django將調(diào)用views.index。第三個實參name='index' 將這個URL模式的名稱指定為index拖云,讓我們能夠在代碼的其他地方引用它贷笛。每當需要提供到這個主頁的鏈接時,我們都將使用這個名稱宙项,而不編寫URL

18.3.2 編寫視圖

from django.shortcuts import render

# Create your views here.
"""學習筆記的主頁"""
def index(request):
    return render(request, 'learning_logs/index.html')

由于我們需要處理任何數(shù)據(jù)乏苦,因此這個函數(shù)只包含調(diào)用render()的代碼。這里向函數(shù)render()提供了兩個實參:原始請求對象以及一個可用于創(chuàng)建網(wǎng)頁的模板。

18.3.3 編寫模板

在learning_logs中新建文件夾templates汇荐,再創(chuàng)建名為learning_logs的文件夾洞就,新建一個index.html的文件
index.html 內(nèi)容

<p>Learning Log</p>
<p>Learning Log helps you keep track of your learning, for any topic you're
learning about.</p>

放置目錄

(ll_env) c5220056@GMPTIC:~/myworkplace/learning_logs/templates/learning_logs$ ls
index.html

再請求項目的基礎(chǔ)URL——http://localhost:8000/,將看到剛才創(chuàng)建的網(wǎng)頁掀淘,而不是默認的Django網(wǎng)頁旬蟋。

學習筆記的主頁

注: 創(chuàng)建網(wǎng)頁的過程看起來可能復雜,但將URL革娄、視圖和模板分離的效果實際上很好咖为。這讓我們能夠分別考慮項目的不同方面,且在項目很大時稠腊,讓各個參與者可專注于其最擅長的方面躁染。例如:數(shù)據(jù)庫專家可專注于模型,程序員可專注于視圖代碼架忌,而Web設(shè)計人員可專注于模板吞彤。

18.4 創(chuàng)建其他網(wǎng)頁

18.4.1 模板繼承

1. 父模板
創(chuàng)建一個名為base.html的模板,這個文件包含所有頁面都有的元素叹放;其他模板都繼承base.html

# base.html
<p>
  <a href="{% url 'learning_logs:index' %}">Learning Log</a>
</p>

{% block content %}{% endblock content %}

模板標簽是用大括號和百分號({% %})表示的饰恕。在實例中,模板標簽 {% url 'learning_logs:index' %} 生成一個URL井仰,該URL與learning_logs/urls.py中定義的名為index的URL模式匹配埋嵌。在這個例子中,learning_logs是一個命名空間俱恶,而index是該命名空間中一個名稱獨特的URL模式雹嗦。
{% block content %}{% endblock content %} 是一對塊標簽。這個塊名為content合是, 是一個占位符了罪,其中包含的信息將由子模板指定。

2. 子模塊
重新編寫index.html

{% 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 %}

18.4.2 顯示所有主題的頁面

1. URL模式
首先聪全,我們定義顯示所有主題Topic的頁面的URL泊藕,我們將使用URL http://localhost:8000/topics/返回所有主題的頁面
修改learning_logs/urls.py

from django.conf.urls import url

from . import views

app_name = 'learning_logs'

urlpatterns = [
    # index
    url(r'^$', views.index, name='index'),
    
    # show all topics
    url(r'^topics/$', views.topics, name='topics'),
]

2. 視圖
函數(shù)topics()需要從數(shù)據(jù)庫中獲取一些數(shù)據(jù),并將其發(fā)送給模板难礼,我們需要在views.py中添加代碼如下:

from django.shortcuts import render

from .models import Topic

# Create your views here.

def index(request):
    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)

這里content是我們定義的一個將要發(fā)送給模板的上下文娃圆。上下文是一個字典,其中的鍵是我們將在模板中用來訪問數(shù)據(jù)的名稱蛾茉, 而值是我們要發(fā)送給模板的數(shù)據(jù)讼呢。

3. 模板
顯示所有主題的頁面的模板接受字典context,以便能夠使用topics()提供的數(shù)據(jù)臀稚。
創(chuàng)建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 %}

模板中使用的代碼與Python代碼存在一些重要差別:Python使用縮進來指出哪些代碼行是for循環(huán)的組成部分怪蔑,而在模板中形帮,每個for循環(huán)都必須使用{% endfor %}標簽來顯式地指出其結(jié)束為止玻粪。因此在模板中橄仍,循環(huán)類似于下面這樣:

{% for item in list %}
  do something with each item
{% endfor %}

修改父模板,使其包含到顯式所有主題的頁面鏈接:

# base.html
<p>
  <a href="{% url 'learning_logs:index' %}">Learning Log</a>
  <a href="{% url 'learning_logs:topics' %}">Topics</a>
</p>

{% block content %}{% endblock content %}

點擊topics稚机,將看到類似如下圖所示的網(wǎng)頁


Topics頁面.png

18.4.3 顯示特定主題的頁面

接下來幕帆,我們想要創(chuàng)建一個專注于特定主題的頁面——顯示該主題的名稱及該主題的所有條目。同樣赖条,我們將定義一個新的URL 模式失乾,編寫一個視圖并創(chuàng)建一個模板。我們還將修改顯示所有主題的網(wǎng)頁纬乍,讓每個項目列表項都是一個連接碱茁,單擊它將顯示相應主題的所有條目。

1. URL模式
顯示特定主題的頁面的URL模式與前面的所有URL模式都稍有不同仿贬,因為它將使用主題的id 屬性來指出請求的是哪個主題纽竣。例如,如果用戶要查看主題Chess(其id 為1)的詳細頁面茧泪,URL將為http://localhost:8000/topics/1/蜓氨。下面是與這個URL匹配的模式,它包含在learning_logs/urls.py中:

# urls.py

from django.conf.urls import url

from . import views

app_name = 'learning_logs'

urlpatterns = [
    # index
    url(r'^$', views.index, name='index'),
    
    # show all topics
    url(r'^topics/$', views.topics, name='topics'),
    
    # show detail info for specific topic
    url(r'^topics/(?P<topic_id>\d+)/$', views.topic, name='topic'),
]

2. 視圖
views.py

from django.shortcuts import render

from .models import Topic

# Create your views here.

def index(request):
    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)
    
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>
    <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. 將顯示所有主題的頁面中的每個主題都設(shè)置為鏈接

{% 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 %}

我們使用模板標簽url根據(jù)learning_logs中名為topic的URL模式來生成合適的鏈接队伟。這個URL模式要求我們提供實參topic_id穴吹,因此我們在模板標簽url中添加了屬性topic.id。
如果你刷新顯示所有主題的頁面嗜侮,再單擊其中的一個主題港令,將看到類似于下圖的頁面:

詳細主題頁面.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锈颗,隨后出現(xiàn)的幾起案子缠借,更是在濱河造成了極大的恐慌,老刑警劉巖宜猜,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泼返,死亡現(xiàn)場離奇詭異,居然都是意外死亡姨拥,警方通過查閱死者的電腦和手機绅喉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叫乌,“玉大人柴罐,你說我怎么就攤上這事『┘椋” “怎么了革屠?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我似芝,道長那婉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任党瓮,我火速辦了婚禮详炬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寞奸。我一直安慰自己呛谜,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布枪萄。 她就那樣靜靜地躺著隐岛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓷翻。 梳的紋絲不亂的頭發(fā)上礼仗,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音逻悠,去河邊找鬼元践。 笑死,一個胖子當著我的面吹牛童谒,可吹牛的內(nèi)容都是我干的单旁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饥伊,長吁一口氣:“原來是場噩夢啊……” “哼象浑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起琅豆,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤愉豺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后茫因,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚪拦,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年冻押,在試婚紗的時候發(fā)現(xiàn)自己被綠了驰贷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡洛巢,死狀恐怖括袒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情稿茉,我是刑警寧澤锹锰,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布芥炭,位于F島的核電站,受9級特大地震影響恃慧,放射性物質(zhì)發(fā)生泄漏园蝠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一糕伐、第九天 我趴在偏房一處隱蔽的房頂上張望砰琢。 院中可真熱鬧蘸嘶,春花似錦良瞧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至况增,卻和暖如春赞庶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背澳骤。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工歧强, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人为肮。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓摊册,卻偏偏與公主長得像,于是被迫代替她去往敵國和親颊艳。 傳聞我的和親對象是個殘疾皇子茅特,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容