Python 項目實踐三(Web應用程序)第二篇


接着上節的繼續學習,使用Django創建網頁的過程通常分三個階段:定義URL、編寫視圖和編寫模板。首先,你必須定義URL模式,每個URL都被映射到特定的視圖——視圖函數獲取並處理網頁所需的數據。視圖函數通常調用一個模板,后者生成瀏覽器能夠理解的網頁。為明白其中的工作原理,我們來創建學習筆記的主頁。我們將定義該主頁的URL、編寫其視圖函數並創建一個簡單的模板。

一 創建網頁:學習筆記主頁

1 映射URL

用戶通過在瀏覽器中輸入URL以及單擊鏈接來請求網頁,因此我們需要確定項目需要哪些URL 。主頁的URL 最重要, 它是用戶用來訪問項目的基礎URL 。當前, 基礎URL(http://localhost:8000/)返回默認的Django網站,讓我們知道正確地建立了項目。我們將修改這一點,將這個基礎URL映射到“學習筆記”的主頁。打開項目主文件夾learning_log中的文件urls.py,你將看到如下代碼:

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

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

默認的urls.py包含在文件夾learning_log中,現在我們需要在文件夾learning_logs中創建另一個urls.py文件:

#定義learning_logs的URL模式

from django.conf.urls import url

form . import views

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

實際的URL模式是一個對函數url()的調用,這個函數接受三個實參。第一個是一個正則表達式。Django在urlpatterns中查找與請求的URL字符串匹配的正則表達式,因此正則表達式定義了Django可查找的模式。

url()的第二個實參指定了要調用的視圖函數。請求的URL與前述正則表達式匹配時,Django將調用views.index(這個視圖函數將在下一節編寫)。第三個實參將這個URL模式的名稱指定為index,讓我們能夠在代碼的其他地方引用它。每當需要提供到這個主頁的鏈接時,我們都將使用這個名稱,而不編寫URL。

2 編寫視圖

視圖函數接受請求中的信息,准備好生成網頁所需的數據,再將這些數據發送給瀏覽器——這通常是使用定義了網頁是什么樣的模板實現的。
learning_logs中的文件views.py是你執行命令python manage.py startapp時自動生成的,當前其內容如下:

from django.shortcuts import render

當前,這個文件只導入了函數render(),它根據視圖提供的數據渲染響應。下面的代碼演示了該如何為主頁編寫視圖:

from django.shortcuts import render

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

3 編寫模板

模板定義了網頁的結構。模板指定了網頁是什么樣的,而每當網頁被請求時,Django將填入相關的數據。模板讓你能夠訪問視圖提供的任何數據。我們的主頁視圖沒有提供任何數據,因此相應的模板非常簡單。

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

如果你請求這個項目的基礎URL——http://localhost:8000/,將看到剛才創建的網頁,而不是默認的Django網頁。Django接受請求的URL,發現該URL與模式r'^$'匹配,因此調用函數views.index(),這將使用index.html包含的模板來渲染網頁,結果如圖:

提示:上面有一個問題,就是報一個錯誤:

  path(r'', include('learning_logs.urls', namespace='learning_logs') ),
  File "D:\study\python\code\learning_log\11_env\lib\site-packages\django\urls\conf.py", line 39, in include
    'Specifying a namespace in include() without providing an app_name '
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.

一定要在D:\study\python\code\learning_log\learning_log下面的urls.py改成如下:

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

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

並在D:\study\python\code\learning_log\learning_logs下面的urls.py加上:app_name='learning_logs'如下:

#定義learning_logs的URL模式

from django.conf.urls import url

from . import views
app_name='learning_logs'
urlpatterns=[
    #主頁
    url(r'^$',views.index,name='index')
    ]

二 創建其他網頁

制定創建網頁的流程后,可以開始擴充“學習筆記”項目了。我們將創建兩個顯示數據的網頁,其中一個列出所有的主題,另一個顯示特定主題的所有條目。對於每個網頁,我們都將指定URL模式,編寫一個視圖函數,並編寫一個模板。但這樣做之前,我們先創建一個父模板,項目中的其他模板都將繼承它。

1 模板繼承

父模板:

我們首先來創建一個名為base.html的模板,並將其存儲在index.html所在的目錄中。這個文件包含所有頁面都有的元素;其他的模板都繼承base.html。當前,所有頁面都包含的元素只有頂端的標題。我們將在每個頁面中包含這個模板,因此我們將這個標題設置為到主頁的鏈接:

<p>
  <a href="{% url 'learning_logs:index' %}">Learning Log</a>
</p>
{% block content %}{% endblock content %}

2 子模板

現在需要重新編寫index.html,使其繼承base.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 %}

今天有事就先寫到這里吧,明天繼續學習!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM