1. 程式人生 > >Django入門(一)——學習筆記

Django入門(一)——學習筆記

說明:該學習筆記是在windows上完成的,所以程式碼部分與linux有區別

第一步:建立專案

1.1 建立虛擬環境

要使用Django,首先需要建立一個虛擬工作環境。虛擬環境是系統的一個位置,可以在其中安裝包,與python的其他包隔離。我們需要新建一個目錄,命名為learning_log,在終端中切換至該目錄,並建立一個虛擬環境,程式碼如下:

1.2 啟用虛擬環境

建立虛擬環境之後,要如下啟用:

linux系統中該步驟的程式碼是:

learning_log$ source ll_env/bin/activate

1.3安裝Django

(ll_env) E:\learning_log>pip install Django

1.4在Django中建立專案

(ll_env) E:\learning_log>django-admin.py startproject learning_log .

如上程式碼新建一個名為learning_log的專案,最後的句點讓新專案的目錄結構更有利於後期將應用程式部署到伺服器

分別執行命令:

(ll_env) E:\learning_log>dir
(ll_env) E:\learning_log>dir learning_log

可以看到對應目錄下新出現的檔案

1.5建立資料庫

(ll_env) E:\learning_log>python manage.py migrate

如果成功後可以看到多了一個圖中的資料庫檔案

1.6 檢視Django是否正確地建立了專案

(ll_env) E:\learning_log>python manage.py runserver

執行程式碼後出現如下:

然後在瀏覽器裡輸入http://127.0.0.1:8000/或者localhost:8000,如果出現下圖中情況,代表我們目前第一步已經成功了

第二步:建立應用程式

2.1建立應用程式的基礎

(ll_env) E:\learning_log>python manage.py startapp learning_logs

命令startapp newapp,讓Django建立建立應用程式所需要的基礎。現在檢視目錄,可以看到新增了一個learning_logs的資料夾,開啟後可以看到新建立了.py檔案

其中最重要幾個的是models.py admin.py views.py;其中models.py是用來定義我們要在應用程式中管理的資料

2.2 定義模型 models.py

開啟上一步新生成的models.py

檔案,輸入如下程式碼:

from django.db import models

# Create your models here.
class Topic(models.Model):
	
	text = models.CharField(max_length=200)
	date_added = models.DateTimeField(auto_now_add=True)
	def __str__(self):
	
		return self.text

在程式碼層面,模型就是一個類;

屬性text是一個CharField——由字元或文字組成的資料,需要儲存少量的文字,比如名稱或者標題

屬性date_added是一個DateTimeField——記錄日期和時間的資料,auto_now_add=True的引數設定,讓Django自動設定成當前日期和時間

2.3啟用模型

需要將新建的模型新增到settings.py中,才可以使用模型,讓Django將應用程式包含到專案中。

開啟settings.py,新增learning_logs

這是一個元組,告訴Django專案是由那些應用程式組成的;接下來需要讓Django修改資料庫,使其能夠儲存跟模型Topic相關的資訊,命令如下:

(ll_env) E:\learning_log>python manage.py makemigrations learning_logs
Migrations for 'learning_logs':
  learning_logs\migrations\0001_initial.py
    - Create model Topic

命令makemigrations讓Django確定該如何修改資料庫,使其能夠儲存我們定義的新模型相關聯的資料,輸出表明建立了一個名字為0001_initial.py的遷移檔案,這個檔案將在資料庫中為模型建立一個表

下面來應用這種遷移,讓Django幫我們修改資料庫:

(ll_env) E:\learning_log>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, learning_logs, sessions
Running migrations:
  Applying learning_logs.0001_initial... OK

每當需要修改專案的管理的資料時:都需要以下三個步驟:1.修改model.py;2.對learning_logs呼叫makemigrations;3.讓Django遷移專案

2.4 Django管理網站

為應用程式定義模型時,Django提供的管理網站可以讓我們輕鬆的處理模型,可以通過使用模型Topic來新增一些主題

建立超級使用者,執行以下操作,並填寫相關資訊:

(ll_env) E:\learning_log>python manage.py createsuperuser
Username (leave blank to use 'dxc'):
Email address:
Password:
Password (again):
Superuser created successfully.

接下來需要向管理網站註冊模型。Django自動在管理網站中添加里一些模型,如User和Group,對於我們建立的模型,必須進行手工註冊。

建立應用程式時,Django在models.py所在的目錄中建立了一個名為admin.py的檔案,開啟該檔案:編輯如下進行新模型Topic的註冊:

from django.contrib import admin

# Register your models here.
from learning_logs.models import Topic

admin.site.register(Topic)

現在就可以使用超級使用者訪問管理網站了,訪問地址就是http://localhost:8000/admin/,輸入賬號密碼之後就可以看到下圖:

可以看到在應用程式learning_logs下面多了一個Topics的模型

可以在topics模型中新增兩個話題python和java,然後分別save

2.5 定義模型Entry

要記錄有關python和java的相關知識,需要為使用者可在學習筆記中新增的條目定義模型。每個條目都與特定主題相關聯,這種關係是多對一的,即多個條目可關聯到同一個主題

在models.py中新增模型Entry的程式碼:


from django.db import models

# Create your models here.
class Topic(models.Model):
	
	text = models.CharField(max_length=200)
	date_added = models.DateTimeField(auto_now_add=True)
	def __str__(self):
	
		return self.text
		
class Entry(models.Model):
	topic = models.ForeignKey(Topic,on_delete = models.CASCADE)
	text = models.TextField()
	date_added = models.DateTimeField(auto_now_add=True)
	
	class Meta:
		verbose_name_plural='entries'
		
	def __str__(self):
		return self.text[:50]+"..."
		

2.6 遷移模型Entry

還是之前的那三個步驟:

(ll_env) E:\learning_log>python manage.py makemigrations learning_logs
Migrations for 'learning_logs':
  learning_logs\migrations\0002_entry.py
    - Create model Entry

(ll_env) E:\learning_log>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, learning_logs, sessions
Running migrations:
  Applying learning_logs.0002_entry... OK

並生成了新的遷移檔案0002——entry.py

2.7向管理網站註冊Entry

將admin.py修改如下:

from django.contrib import admin

# Register your models here.
from learning_logs.models import Topic,Entry

admin.site.register(Topic)
admin.site.register(Entry)

第三步:建立網頁:Learning Log主頁

使用Django建立網頁的過程通常分為三個階段:1.定義URL;2.編寫檢視;3.編寫模板.

3.1對映URL

開啟learning_log中的檔案urls.py,編輯如下程式碼:

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

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

在learning_logs中建立另一個urls.py檔案如下:

from . import views
from django.urls import path,include

urlpatterns = [

	path('',views.index,name = 'index')
]

3.2編寫檢視

開啟learning_logs\views.py,並編輯如下:

from django.shortcuts import render

# Create your views here.
def index(request):
	return render(request,'learning_logs/index.html')

3.3編寫模板

模板定義了網頁的結構,在資料夾learning_logs中新建一個資料夾,並命名為templates,在templates中再新建一個learning_logs的資料夾,在該資料夾中新建一個index.html檔案。

程式碼如下(隨便寫什麼,我這裡放了Zen of Python):

<p>Learning Log</p>
<p>The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!</p>

第四步:建立其他網頁

4.1模板繼承

4.1.1 父模板

首先在index.html所在的目錄建立一個名字為base.html的模板,這個模板包含其他所有頁面都有的元素,其他的模板都繼承base.html。

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

4.1.2 子模版

現在需要重新寫index.html,使它繼承base.html

{% extends "learning_logs/base.html" %}

{% block content %}
	<p>The Zen of Python, by Tim Peters

	Beautiful is better than ugly.
	</p>
{% endblock content %}

4.2顯示所有主題頁面

4.2.1 URL模式

首先定義顯示所有主題頁面的URL,

from . import views
from django.urls import path,include,re_path

urlpatterns = [
	path('',views.index,name='index'),
    path('topics/',views.topics,name='topics'),
]
app_name = 'learning_logs'

4.2.2 檢視views

函式topics()需要從資料庫中獲取資料,並將其傳送給模板,更改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):
	topics = Topic.objects.order_by('date_added')
	context = {'topics':topics}
	return render(request, 'learning_logs/topics.html', context)

4.2.3模板

顯示所有主題頁面的模板接受字典context,以便能夠使用topics()提供的資料,建立檔案topics.html,儲存到index.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 %}

下一步需要修改父模板,使其包含到顯示所有主題的頁面的連結

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

此時訪問localhost:8000/topics/將會看到下面這樣的網頁: