系統:Ubuntu16.04html
Python版本:python3.5.2python
1、創建虛擬環境shell
要使用Django,首先須要創建一個虛擬工做環境。虛擬環境是系統中的一個位置,你能夠在其中安裝包,並將其與其餘Python包隔離。數據庫
將項目的庫與其餘項目分離是有益的。django
安裝virtualenv,終端運行編程
sudo apt-get install python-virtualenv
爲項目新建一個目錄,將其命名爲learning_log,並在終端切換到目錄learning_log,建立一個虛擬環境:segmentfault
virtualenv ll_env --python=python3
如圖:瀏覽器
激活虛擬環境:服務器
source ll_env/bin/activate
如圖:session
環境處於活動狀態時,環境名將包含在括號內。
關閉虛擬環境:
deactivate
安裝Django
(ll_env) czz@xcy-laptop:~/PycharmProjects/Project_3/learning_log$ pip install Django
在Django中建立項目(需在虛擬環境下):最後的句點千萬別忘了
django-admin startproject learning_log .
如圖:
建立數據庫:
python manage.py migrate
查看項目:
python manage.py runserver
將會 有以下輸出:
Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). April 20, 2019 - 08:10:02 Django version 2.2, using settings 'learning_log.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
打開瀏覽器,並輸入URL:http://127.0.0.1:8000/出現下面的頁面:
這是最新版的Django的默認啓動界面。暫且不要關閉它。
2、建立應用程序
前面打開的終端窗口應該還運行着runserver,再打開一個終端窗口,並切換到manage.py所在的目錄,激活虛擬環境並執行命令
python manage.py startapp learning_logs
定義模型:
打開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
建立了一個Topic類,它繼承了Model。
激活模型:
打開learning_log/learning_logs/settings.py,將前面的程序添加到這個元組中
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', #個人應用程序,以上都是自帶的,Django2.0這樣添加 'learning_logs.apps.LearningLogsConfig', ]
在終端依次輸入
python manage.py makemigrations learning_logs
python manage.py migrate
每當須要修改「學習筆記」管理的數據時,都採起以下三個步驟:修改model.py;對learning_logs調用makemigrations;讓Django遷移項目。
建立超級用戶:終端輸入(虛擬環境下)
python manage.py createsuperuser
依提示輸入用戶名、密碼,郵箱能夠不填(Enter)
向管理網站註冊模型,在learning_logs中找到admin.py,打開並修改:
from django.contrib import admin # Register your models here. #導入模型Topic from learning_logs.models import Topic #註冊 admin.site.register(Topic)
終端執行命令,運行Django服務器:
python manage.py runserver
訪問http://localhost:8000/admin/,輸入用戶名和密碼,可見:
手動添加主題,單擊Topic,進入表單,使用add添加主題Chess和Rocking Climbing
定義模型Entry:條目,多個條目可關聯同一主題
打開models.py
-----snip------ class Entry(models.Model): "學到的有關某個主題的具體知識" #外鍵,數據庫術語,將每一個條目關聯到特定的主題 topic = models.ForeignKey(Topic, on_delete=models.CASCADE) #條目文本 text = models.TextField() #時間戳 date_added = models.DateTimeField(auto_now_add=True) #嵌套類Meta,它用於管理模型的額外信息。它讓咱們可以設置一個特殊屬性,讓Django在須要時 # 使用Entries來表示多個條目。若是沒有這個類,Django將使用Entrys來表示多個條目,保證英語語法正確 class Meta: verbose_name_plural = 'entries' #呈現條目時應顯示的信息 def _str_(self): "返回模型的字符串表示" return self.text[:50] + '...'
遷移模型Entry,終端輸入:
python manage.py makemigrations learning_logs
python manage.py migrate
向網站註冊Entry,修改admin.py文件
from django.contrib import admin # Register your models here. #導入模型Topic from learning_logs.models import Topic, Entry #註冊 admin.site.register(Topic) admin.site.register(Entry)
以上仍是老三步:修改model.py;對learning_logs調用makemigrations;讓Django遷移項目,而後在admin.py文件註冊Entry。
接下來就能夠添加條目了,在Chess中添加了一個條目,就不細寫了。
Django Shell
輸入一些數據後,可經過交互式終端會話以編程方式查看這些數據。這種交互式環境稱爲Django shell,是測試項目和排除故障的理想之地。
(ll_env)learning_log$ python manage.py shell # 啓動shell >>> from learning_logs.models import Topic >>> Topic.objects.all() # 得到模型Topic的全部實例 <QuerySet [<Topic: Chess>, <Topic: Rock Climbing>]> # 返回了一個查詢集QuerySet >>> topics = Topic.objects.all() # 查詢每一個Topic對象 >>> for topic in topics: ... print(topic.id, topic) ... 1 Chess 2 Rock Climbing >>> t = Topic.objects.get(id=1) # 根據id查看Chess模型的具體內容 >>> t.text 'Chess' >>> t.date_added datetime.datetime(2018, 4, 22, 2, 4, 3, 723045, tzinfo=<UTC>) >>> t.entry_set.all() # 查看該主題下的全部條目,經過外鍵查詢,進行了人爲換行 <QuerySet [<Entry: The opening is the first part of the game, roughly...>, <Entry: In the opening phase of the game, it's important t...>]>
建立網頁:編寫學習筆記
Django建立網頁的過程一般分三個階段:定義URL、編寫視圖和編寫模板。
映射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')) ]#此處有關namespace的在網上查詢後好像搞到下面去了,不知道對不對
還須要在learning_logs
中建立另外一個urls.py
文件:
'''定義learning_logs的url模式''' from django.urls import path from . import views app_name = 'learning_logs' urlpatterns = [ #主頁 path(r'', views.index, name='index'),#原書中的正則不行 ]
總之,就是在learning_log/urls.py中添加learning_log中的全部URL,並匹配主頁。
編寫視圖
打開learning_logs/views.py,添加
from django.shortcuts import render # Create your views here. def index(request): "學習筆記的主頁" return render(request, 'learning_logs/index.html')
編寫模板
在learning_logs
文件夾中新建一個templates
文件夾,再在這個文件夾中新建一個和APP同名的文件夾,即learning_logs
文件夾,最後,在這個learning_logs
文件夾中新建index.html
文件。index.html文件內容以下:
<p>Learning Log</p> <p>Learning Log helps you keep track of your learning, for any topic your're learning about.</p>
如今打開這個項目的基礎URL------http://localhost/8000/,能夠看到剛纔建立的網頁
建立其餘網頁
建立兩個用於顯示數據的網頁,其中給一個列出全部的主題,另外一個顯示特定主題的全部條目。對於每一個網頁都指定URL模式,編寫一個視圖函數,並編寫一個模板。但這麼作以前,咱們先建立一個父模板,項目中的其餘模板都將繼承它。
父模板base.html(在index.html所在的目錄下)
<p> <a href="{% url 'learning_logs:index' %}">Learning Log</a> <p> {% block content %}{% endblock content %}
第一段落是一個模板標籤,它匹配到主頁的連接。第二段插入了一對塊標籤,名爲content,其中的內容將由子模板指定。
子模板index.html修改
{% extends "learning_logs/base.html"%} {% block content%} <p>Learning Log helps you keep track of your learning, for any topic your're learning about.</p> {% endblock content %}
第一段標籤{% extends}表示繼承哪一個父模板,第二段,包含子模塊的內容。
顯示全部主題的頁面
1.URL模式
修改learning_logs/urls.py
'''定義learning_logs的url模式''' from django.urls import path from . import views app_name = 'learning_logs' urlpatterns = [ #主頁 path(r'', views.index, name='index'), #顯示全部主題頁面 path(r'topics', views.topics, name=topics)#定義並匹配URL注意Django2.0path不支持正則表達,如要使用需導入re_path,使用re_path ]#注意是中括號,不是大括號,這塊出錯花了我很長時間。。。
視圖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')#訪問數據庫,將結果按時間排序並將查詢集存儲在 topics中 context = {'topics': topics}#上下文字典,發送給模板,鍵是用來訪問數據的名稱,值是發送給模板的數據 return render(request, 'learning_logs/topics.html', context)#這是一個渲染函數
模板
建立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 %}
修改父模板base.html,使其包含到顯示全部主題的頁面的連接
<p> <a href="{% url 'learning_logs:index' %}">Learning Log</a> - <a href="{% url 'learning_logs:topics' %}">Topics</a> <p> {% block content %}{% endblock content %}
如今若是進入http://localhost:8000/,將看到添加的Topics連接,單擊連接將看到
顯示特定主題的頁面
1.URL模式
修改learning_logs/urls.py
-----snip------ urlpatterns = [ -------snip------- #特定主題的詳細頁面 path(r'topics/<int:topic_id>/', views.topic, name='topic')#使用主題的ID來指出請求的是哪一個主題 ]
視圖views.py
函數topic()須要從數據庫中獲取指定的主題以及與之相關聯的全部條目
------snip-------- 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)
模板
在index.html所在的目錄下建立topic.html
{% extends "learning_logs/base.html"%} {% block content %} <p>Topic: {{ topic }}</p> <p>Entries:</p> <ul> {% for entry in entriies% } <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.html
---------snip----- {% for topic in topics%} <li> <a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a> </li> {% empty %} --------snip----------
刷新全部主題頁面,點擊Topics,選擇某一主題,將看到相似於下圖的畫面。
小結
1.制定了簡要的項目規範,在虛擬環境下安裝了Django,建立項目並覈實該項目已經正確的建立。
2.建立應用程序,定義表示應用程序數據的模型
3.建立數據庫,修改模型後,Django可爲遷移數據庫提供怎樣的幫助
4.建立超級用戶
5.Django shell
6.定義URL,建立視圖函數,編寫模板(包括模板的繼承)
本文爲《Python編程:從入門到實踐》筆記,並參考了博文https://segmentfault.com/a/1190000015098721