摘要:簡單修改、增加部分頁面,了解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 %}
保存后運行,打開瀏覽頁面如下:


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/472432.html
標籤:其他
