django基礎--02基於資料庫的小專案

PursuitingPeak發表於2022-05-12

摘要:簡單修改、增加部分頁面,瞭解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 %}

儲存後執行,開啟瀏覽頁面如下:

 

 

相關文章