摘要:簡單修改、增加部分頁面,瞭解django開發的過程。(Python 3.9.12,django 4.0.4 )
接前篇,通過命令: django-admin startproject myWebSite 創立了新的站點,cd myWebSite進入到站點根目錄,並用命令python manage.py runserver 8080(或其他埠號) 就可使專案執行,然而這只是一個空殼,無任何作用,下面通過一個小應用對開發過程進行介紹。
退出執行狀態:當專案執行時,按下鍵盤上的ctrl和Break鍵,退出到根目錄下。
一、建立一個顯示當前日期和時間的網頁
1、Django專案由一系列應用程式組成,比如,一個站點分別由不同的版塊組成,每一個版塊可以是一個獨立的站點,它們協同工作,讓專案成為一個整體
首先,建立一個應用程式,anaconda promt 中進入到根目錄下,輸入命令:python manage.py startapp myblogs
這樣,在根目錄下,有4個檔案,其中myblogs和myWebSite是2個資料夾,資料庫db.sqlite3,以及manage.py檔案。
進入到myWebSite資料夾中:
1)修改setting.py檔案如下:
'django.contrib.staticfiles', 'myblogs', #增加此行 ] # 中間略去 N 行 LANGUAGE_CODE = 'zh-hans' #修改為中文,頁面顯示為中文 TIME_ZONE = 'Asia/Shanghai' #修改時區
2)修改urls.py檔案
urlpatterns = [ path('admin/', admin.site.urls),#系統預設
path('myblogs/', include('myblogs.urls')),#在路徑“myblogs/”中,找到myblogs.urls檔案,並讀取urls中的配置() ]
進入到myblogs資料夾中:
1)修改urls.py檔案如下:(如果沒有,把myWebSite資料夾中的拷貝過來修改)
from django.contrib import admin from django.urls import path from . import views # 匯入myblogs資料夾中的views urlpatterns = [ path('admin/', admin.site.urls), path('', views.current_datetime, name='datetime'), #呼叫views.py檔案中的current_datetime
]
2)修改views.py檔案如下:
from django.shortcuts import render from django.http import HttpResponse # 從django.http 模組匯入(import) HttpResponse 類 import datetime #從Python標準庫(自帶)中匯入datetime 模組 def current_datetime(request): #定義一個檢視函式current_datetime 的函式current_datetime。 now = datetime.datetime.now() # datetime.datetime.now(),獲取當前時間,並儲存為區域性變數 now html = "<html><body>It is now %s.</body></html>" % now #用 Python 的格式化字串(format-string)功能構造一段 HTML 響應 #字串裡面的 %s 是佔位符,字串之後的百分號表示使用變數 now 的值替換 %s return HttpResponse(html) #檢視返回一個包含所生成響應的 HttpResponse 物件
儲存上述相關檔案,並執行 manage.py runserver 8090
在瀏覽器中輸入 http://127.0.0.1:8090/myblogs/ 即開啟一個頁面,並顯示當前時間。
二、建立應用
上述例子檢視中返回文字,HTML被直接寫入 Python 程式碼之中的,是不現實的,因為頁面往往顯示更多的內容,以及需要頻繁地修改。這會導致下列問題:
1)每次對頁面設計的進行的修改都必須對 Python 程式碼進行改動。
2)Python 程式碼編寫和 HTML或css 設計是兩項不同的工作,實際開發過程中,會分配給不同的人員(甚至不同部門)來完成。
3)開發人員編寫 Python 程式碼和設計人員製作模板同時進行的工作方式效率是最高的。
基於上述原因,將頁面的設計和Python的程式碼分離開會更乾淨簡潔更容易維護,可以使用 Django的 模板系統 (TemplateSystem)來實現這種模式。
1、建立資料庫
由於Django將大部分與專案相關的資訊都儲存在資料庫中,因此需建立一個供Django使用的資料庫。為給專案建立資料庫,退出上述服務執行,並執行命令:python manage.py migrate
如上圖完成後,位於myWebSite根目錄下的db.sqlite3檔案大小不為0,如下圖:
2、建立應用模組
由於之前已創立myblogs應用,現在建立相關模組。開啟myblogs資料夾下的models.py檔案,修改如下:
from django.db import models class Topic(models.Model): #建立一個topic類, text = models.CharField(max_length=200) #屬性text是一個CharField,由字元或文字組成的資料 date_added = models.DateTimeField(auto_now_add=True) def __str__(self): #返回儲存在屬性 text中的字串 return self.text
要使用建立的模型,必須讓Django將應用程式包含到專案中。為此,開啟myWebSite資料夾下的settings.py檔案,並進行如下配置:
INSTALLED_APPS = [ 'myblogs', 'django.contrib.admin', 'django.contrib.auth',
.
.
.
為使資料庫能夠儲存與模型 Topic 相關的資訊,需要對資料庫進行更新,分別執行命令: python manage.py makemigrations myblogs 和 python manage.py migrate 執行結果如下:
3、管理網站
有效地管理Web應用程式,網站管理員通常需要訪問網站儲存的所有資訊
1)建立管理員帳戶:直接輸入命令:python manage.py createsuperuser 如下圖
注意:輸入密碼時,無顯示
4、向網站註冊模型
對於我們建立的模型,必須手工進行註冊,建立應用程式myblogs時,Django在models.py所在的目錄中建立了一個名為admin.py的檔案,開啟並做如下修改:
from django.contrib import admin from myblogs.models import Topic #匯入需要註冊的模型Topic admin.site.register(Topic) #使用 admin.site.register()註冊,讓Django通過管理網站管理模型
接下來執行服務,就可以訪問超級使用者賬戶並管理網站。執行命令:python manage.py runserver 8090,並開啟 http://127.0.0.1:8090/admin
即可進行登入介面,輸入使用者名稱和密碼,顯示如下:
點選topics後的增加,新增java、python、c++等。
5、增加新模型,具體程式碼如下:
from django.db import models class Topic(models.Model): #建立一個topic類, text = models.CharField(max_length=200) #屬性text是一個CharField,由字元或文字組成的資料 date_added = models.DateTimeField(auto_now_add=True) def __str__(self): #返回儲存在屬性 text中的字串 return self.text class Entry(models.Model): # 新建一個模型 topic = models.ForeignKey(Topic,on_delete=models.CASCADE) #屬性topic是一個ForeignKey例項,topic建立時,都給它分配了一個鍵 text = models.TextField() #屬性text,它是一個TextField例項 date_added = models.DateTimeField(auto_now_add=True) class Meta: #在 Entry 類中巢狀了Meta類,用於管理額外資訊 verbose_name_plural = 'entries' def __str__(self): #返回text中前50個字元,後面用省略號替代。 return self.text[:50] + "..."
由於新加一個新模型,因此需要再次遷移資料庫。
執行命令 python manage.py makemigrations myblogs ,
再執行命令 python manage.py migrate
繼續註冊,修改myWebSite\myblogs中admin.py檔案,如下圖:
from django.contrib import admin from myblogs.models import * #匯入我們要註冊的模型,注意由原來的 import Topic 修改為import * 了 admin.site.register(Topic) #使用 admin.site.register()註冊,讓Django通過管理網站管理模型 admin.site.register(Entry)
儲存後,執行服務並登入管理員帳戶,即可新增如下內容。
三、建立網頁:blogs主頁
從上面的過程中可以看出,建立網頁的過程通常分三個階段:定義URL、編寫檢視和編寫模板
1)定義URL:URL模式描述了URL是如何設計的,讓Django知道如何將瀏覽器請求與網站URL匹配,以確定返回對應的網頁。每個URL都被對映到特定的檢視——檢視函式獲取並處理網頁所需的資料。
2)檢視:檢視函式通常呼叫一個模板,後者生成瀏覽器能夠理解的網頁。
3)模型:資料庫驅動的 Web 應用的第一步是定義模型 - 也就是資料庫結構設計和附加的其它後設資料。模型是真實資料的簡單明確的描述。它包含了儲存的資料所必要的欄位和行為。
1、修改urls檔案
開啟專案主資料夾myWebSite中的檔案urls.py檔案,並進行如下修改:
from django.contrib import admin from django.urls import path,include #匯入為專案和管理網站管理URL的函式和模組 urlpatterns = [ path('admin/', admin.site.urls), path('myblogs/', include('myblogs.urls')), #包含模組myblogs.urls,包含實參name,可將myblogs的URL同專案中的其他URL區分開來 ]
開啟專案主資料夾myblogs中的檔案urls.py檔案(如果沒有,可把上述檔案拷貝後修改),並進行如下修改:
from django.contrib import admin from django.urls import path from . import views app_name='myblogs'
urlpatterns = [ path('admin/', admin.site.urls), path('', views.index, name='index'), ]
2、編寫檢視
檢視函式 接受請求中的資訊,準備好生成網頁所需資料,再將這些資料傳送給瀏覽器。開啟myblogs中的views.py檔案,修改如下並儲存:
from django.shortcuts import render from django.http import HttpResponse import datetime """ def current_datetime(request): #定義一個檢視函式current_datetime 的函式current_datetime。 now = datetime.datetime.now() # datetime.datetime.now(),獲取當前時間,並儲存為區域性變數 now html = "<html><body>It is now %s.</body></html>" % now #用 Python 的格式化字串(format-string)功能構造一段 HTML 響應 #字串裡面的 %s 是佔位符,字串之後的百分號表示使用變數 now 的值替換 %s return HttpResponse(html) #檢視返回一個包含所生成響應的 HttpResponse 物件 """ def index(request): return render(request, 'myblogs/index.html')
暫時隱藏部分內容。
3、建立一個index.html檔案,程式碼如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="en"> <head> <title>Future time</title> </head> <body> <h1>welcome to my site!</h1> <p></p> <hr> <p>Thanks for visiting my site.</p> </body> </html>
(不瞭解hmyWebSitetml語言可以先了解一下,這裡不做過多介紹。) 在資料夾myblogs中新建一個資料夾,並將其命名為templates。在資料夾templates中,再新建一個資料夾,並將其命名為myblogs,即:myWebSite\myblogs\templates\myblogs
並將index.html檔案儲存到此目錄下。
儲存並執行命令:python manage.py runserver 8090 。在瀏覽器中輸入:http://127.0.0.1:8090/myblogs/ 即可看到如下畫面:
四、擴充更多的網頁
1、模板繼承
建立網站時,幾乎都有一些所有網頁都將包含的元素。比如上面顯示的“welcome to my site“,讓它顯示在所有相關的網頁上,因此可編寫一個包含通用元素的父模板,並讓其他的網頁都繼承這個模板即可。
1)建立一個簡單的父模板base.html
在檔案目錄myWebSite\myblogs\templates\myblogs下,新建一個base.html檔案,內容如下:
<p> <a href="{% url 'myblogs:index' %}">welcome to my blogs site!</a> </p> {% block content %} #插入了一對塊標籤。這個塊名為 content ,是一個佔位符,其中包含的資訊將由子模板指定
{% endblock content %}
2) 修改index.html檔案,讓其繼承base.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> {% extends "myblogs/base.html" %} {% block content %} <p>Thanks for visiting my site!</p> {% endblock content %}
執行結果:
2,簡單的連結的頁面
1)在myWebSite\myblogs\templates\myblogs下,增加一個topics.html檔案
{% extends "myblogs/base.html" %} {% block content %} <ul> {% for topic in topics %} <li>{{ topic }}</li> {% empty %} <li>No topics have been added yet.</li> {% endfor %} </ul> {% endblock content %}
2)修改myblogs檔案中的urls.py檔案
from django.contrib import admin from django.urls import path from . import views app_name='myblogs' urlpatterns = [ path('admin/', admin.site.urls), path('', views.index, name='index'), path('topics/',views.topics,name='topics'), ]
3)修改主站點的urls檔案(myWebSite資料夾)
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('myblogs/',include('myblogs.urls')), path('topics/',include('myblogs.urls')), ]
4)修改myblogs檔案中的views檔案
from django.shortcuts import render from django.http import HttpResponse from .models import * def index(request): return render(request, 'myblogs/index.html') def topics(request): topics = Topic.objects.order_by('date_added') #查詢資料庫——請求提供 Topic 物件 context = {'topics':topics} return render(request,'myblogs/topics.html',context)
儲存並執行。開啟 :http://127.0.0.1:8090/myblogs/ 點選Blogs如下所示:
點選Topics如下所示:
一個簡單可互動的網站就誕生了。
3、顯示特定主題的頁面
前面增加了python、java、c++描述,如何在不同的頁面顯示。
1)增加新的檢視
由於在新的頁面中,顯示模型類Entry的text屬性,因此需要新增加檢視,如下:
from django.shortcuts import render from django.http import HttpResponse from .models import * def index(request): return render(request, 'myblogs/index.html') def topics(request): topics = Topic.objects.order_by('date_added') #查詢資料庫——請求提供 Topic 物件 context = {'topics':topics} return render(request,'myblogs/topics.html',context) #將變數 context 傳遞給 render() 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, 'myblogs/topic.html', context)
2)修改myblogs檔案中的urls.py檔案
from django.contrib import admin from django.urls import path from . import views app_name='myblogs' urlpatterns = [ path('admin/', admin.site.urls), path('', views.index, name='index'), path('topics/',views.topics,name='topics'), path('topics/(?P<topic_id>\d+)/', views.topic, name='topic'), ]
3)修改html檔案:
修改topics檔案,如下:
{% extends "myblogs/base.html" %} {% block content %} <p>Topics</p> <ul> {% for topic in topics %} <li> <a href="{% url 'myblogs:topic' topic.id %}">{{ topic }}</a> </li> {% empty %} <li>No topics have been added yet.</li> {% endfor %} </ul> {% endblock content %}
新增加一個topic.html檔案:
{% extends "myblogs/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 %}
儲存後執行,開啟瀏覽頁面如下: