一、環境搭建
1.要使用 Django ,首先需要建立一個虛擬工作環境。 虛擬環境 是系統的一個位置,你可以在其中安裝包,並將其與其他 Python 包隔離
新建一個目錄,將其命名爲 learning_log ,再在終端中切換到這個目錄,並創建一個虛擬環境。如果你使用的是 Python 3 ,
可使用如下命令來創建虛擬環境.
learning_log$ python -m venv ll_env
2.激活虛擬環境
learning_log$ source ll_env/bin/activate(linux 下)
ll_env\Scripts\activate (window 下)
3.停止使用虛擬環境
deactivate
4.安裝 Django
創建並激活虛擬環境後,就可安裝 Django 了:
pip install Django
5.在 Django 中創建項目
在依然處於活動的虛擬環境的情況下( ll_env 包含在括號內),執行如下命令來新建一個項目:
django-admin.py startproject learning_log .
6.創建數據庫
創建一個供 Django 使用的數據庫,處於活動虛擬環境中的情況下執行下面的命令
python manage.py migrate
7.覈實 Django 是否正確地創建了項目:
python manage.py runserver
二、創建應用:
Django 項目 由一系列應用程序組成,它們協同工作,讓項目成爲一個整體。
1.在前面打開的終端窗口中應該還運行着 runserver
再打開一個終端窗口(或標籤頁),並切換到 manage.py 所在的目錄。激活該虛擬環境,再執行命令 startapp :
ll_env/bin/activate 激活
python manage.py startapp learning_logs
2.定義模型
打開文件 models.py 編輯自己的主題模型,添加如下代碼:
class Topic(models.Model):
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
# toString
def __str__(self):
return self.text
激活模型
settings.py (它位於目錄 learning_log/learning_log 中)
將應用添加到 INSTALLED_APPS中
INSTALLED_APPS = (
--snip--
# my app
'learning_logs',
)
接下來,需要讓 Django 修改數據庫,使其能夠存儲與模型 Topic 相關的信息,
在終端窗口中執行下面的命令:
(ll_env)learning_log$ python manage.py makemigrations learning_logs
命令 makemigrations 讓 Django 確定該如何修改數據庫,使其能夠存儲與我們定義的新模型相關聯的數據。輸出表明 Django
創建了一個名爲 0001_initial.py 的遷移文件,這個文件在數據庫中爲模型 Topic 創建一個表。
下面來應用這種遷移,讓 Django 替我們修改數據庫:
(ll_env)learning_log$ python manage.py migrate
三、Django 管理網站
1. 創建超級用戶
(ll_env)learning_log$ python manage.py createsuperuser
2. 向管理網站註冊模型
Django 自動在管理網站中添加了一些模型,如 User 和 Group ,但對於我們創建的模型,必須手工進行註冊。
創建應用程序 learning_logs 時, Django 在 models.py 所在的目錄中創建了一個名爲 admin.py 的文件:
添加如下代碼:
from learning_logs.models import Topic
admin.site.register(Topic)
訪問http://localhost:8000/admin/ 這個個網頁讓你能夠添加和修改用戶和用戶組,還可以管理與剛纔定義的模型 Topic 相關的數據
然後可在topic部分添加(add)主題
四:定義模型 Entry
eg:要記錄學到的國際象棋和攀巖知識,需要爲用戶可在學習筆記中添加的條目定義模型。每個條目都與特定主題相關聯,這種關係被稱爲多對一關係,即多個條目可關聯到同一個
主題。
1.models.py 添加
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] + "..."
第一個屬性 topic 是一個 ForeignKey 實例這些代碼將每個條目關聯到特定的主題。每個主題創建時,都給它分配了一個鍵(或 ID ),
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五個可選擇的值:
CASCADE:此值設置,是級聯刪除;
PROTECT:此值設置,是會報完整性錯誤;
SET_NULL:此值設置,會把外鍵設置爲null,前提是允許爲null;
SET_DEFAULT:此值設置,會把設置爲外鍵的默認值;
SET():此值設置,會調用外面的值,可以是一個函數。
2.遷移模型 Entry
(ll_env)learning_log$ python manage.py makemigrations learning_logs
3.向管理網站註冊 Entry
爲此,需要將 admin.py 修改成類似於下面這樣:
from django.contrib import admin
from learning_logs.models import Topic, Entry
admin.site.register(Topic)
admin.site.register(Entry)
五:Django shell
python manage.py shell
交互式終端會話可以以編程方式查看數據
六、創建網頁
1.打開項目主文件夾 learning_log 中的文件 urls.py,包含 learning_logs 的 URL
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('learning_logs.urls', namespace='learning_logs')),
]
2.默認的 urls.py 包含在文件夾 learning_logs 中,現在我們需要在文件夾 learning_logs 中創建另一個 urls.py
from django.urls import path
from . import views
app_name='learning_logs'
urlpatterns = [
# homePage
path('', views.index, name='index'),
]
3.編寫視圖
learning_logs 中的文件 views.py 是你執行命令 python manage.py startapp 時自動生成的,修改其內容:
from django.shortcuts import render
# Create your views here.
def index(request):
# incdex page
return render(request, 'learning_logs/index.html')
4。編寫模板
在文件夾 learning_logs 中新建一個文件夾,並將其命名爲 templates 。
在文件夾 templates 中,再新建一個文件夾,並將其命名爲 learning_logs
在最裏面的文件夾 learning_logs 中,新建一個文件,並將其命名爲 index.html
<p>Learning Log</p>
<p>Welcome,Learning Log helps you keep track of your learning, for any topic you're
learning about.</p>
如此,首頁便創建成功,瀏覽訪問localhost:8000即可查看結果
5.創建其他網頁
模板繼承:創建網站時,幾乎都有一些所有網頁都將包含的元素。在這種情況下,可編寫一個包含通用元素的父模板,並讓每個網頁都繼承這個模板,而不必在每個網頁中重複定義這些通
用元素。
父模板 base.html,並將其存儲在 index.html 所在的目錄中:
<p><a href="{% url 'learning_logs:index' %}">Learning Log</a></p>
{% block content %}{% endblock content %}
子模板 重新編寫index.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 %}
6.顯示所有主題的頁面
URL 模式
修改 learning_logs/urls.py :
from django.urls import path
from . import views
app_name='learning_logs'
urlpatterns = [
# homePage
path('', views.index, name='index'),
# all topics
path('topics/', views.topics, name='topics'),
]
修改視圖,views.py添加如下:
from .models import Topic
def topics(request):
topics = Topic.objects.order_by('date_added')
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)
編寫topics.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 %}
7.顯示特定主題的頁面
learning_logs/urls.py添加如下代碼:
from django.urls import path, re_path
re_path(r'^topics/(?P<topic_id>\d+)/$', views.topic, name='topic'),
這裏用到了python正則表達式,/(?P<topic_id>\d+)/與包含在兩個斜槓內的整數匹配,
並將這個整數存儲在一個名爲topic_id的實參中。?P<topic_id>將匹配的值存儲到topic_id中;
而表達式\d+與包含在兩個斜杆內的任何數字都匹配,不管這個數字爲多少位。
發現URL與這個模式匹配時,Django將調用視圖函數topic(),並將存儲在topic_id中的值作爲實參傳遞給它。
learning_logs/views.py 添加如下代碼:
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, 'learning_logs/topic.html', context)
templates\learning_logs下添加topic.html:
{% extends 'learning_logs/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 %}
修改topics模板
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Topics</p>
<ul>
{% for topic in topics %}
<li>
<a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
</li>
{% empty %}
<li>No topics have been added yet.</li>
{% endfor %}
</ul>
{% endblock content %}
一篇更爲詳細的:https://blog.csdn.net/miss1181248983/article/details/95473776