Django-C001-快速入門

此文章完成度【100%】留着之後忘記的回顧。多寫多練多思考,我會努力寫出有意思的demo,若是知識點有錯誤、誤導,歡迎你們在評論處寫下你的感想或者糾錯。

 

Django

  Django是一個開放源碼的Web應用框架,由Python寫成,採用MVT的框架模式,它最初是被開發用於管理勞倫斯出版社集團旗下的一些以新聞內容爲主的網站,CMS(內容管理系統)軟件。並於2005年7月在BSD許可證下發布。這套框架是以比利時的吉普賽爵士吉他手Django Reinhardt來命名的。

 

 

框架介紹


 

  Django 項目是一個Python定製框架,它源自一個在線新聞Web站點,於2005年以開源的形式被釋放出來,Django框架的核心組件有:

      • 用於建立模型的對象關係映射(Object Relational Mapping,簡稱ORM)
      • 爲最終用戶設計的完美管理界面
      • 一流的 URL 設計
      • 設計者友好的模板語言
      • 緩存系統

    Django使用 Python語言寫的開源Web開發框架 (open source web framework),它鼓勵快速開發,並遵循MVC設計。Django遵照BSD版權,
html

  初次發佈於2005年,並在2008年發佈了第一個正式版本1.0前端

 

架構設計


  Django是一個基於MVC構造的框架,可是在Django中,控制器接受用戶輸入的部分由框架自行處理,因此Django裏更關注的是模型 (Model)、視圖(Views)、模板(Template),被稱爲MVT模式。

 M  模型(Model),即數據存取層 處理與數據相關的全部事務: 如何存取、如何驗證有效性、包含哪些行爲以及數據之間的關係等。
 V 視圖 (View),即業務邏輯層 存取模型及調取恰當模板的相關邏輯。模型與模板的橋樑
 T

模板 (Template)python

即表現層mysql

處理與表現相關的決定,如何在頁面或其餘類型文檔中進行顯示

  從以上表述能夠看出 Django 視圖不處理用戶輸入,而僅僅決定要展示哪些數據給用戶,而 Django 模板僅僅決定如何展示Django 視圖指定的數據,或者說,Django 將 MVC 中的視圖進一步分解爲 Django 視圖和 Django 模板兩個部分,分別決定展示哪些數據和如何展示,使得Django的模板能夠根據須要隨時替換,而不只僅限制於內置的模板

  至於 MVC 控制器部分,由 Django 框架的 URLconf 機制是使用正則表達式匹配URL,而後調用適合的Python函數,URLconf對於URL的規則沒有任何限制,你徹底能夠設計成任意的URL風格,框架把控制層給封裝了,無非與數據交互這層都是數據庫表的增、刪、改、查的操做,在寫程序時候,只要調用相應的方法就好了,感受很方便,程序員把控制層東西交給了Django自動完成,只須要編寫很是少的代碼就能夠完成不少事情。

設計哲學


 

Django的主要目的是簡便、快速的開發數據庫驅動的網站。它強調代碼複用,多個組件能夠很方便的以「插件」形式服務於整個框架,Django有許多功能強大的第三方插件,你甚至能夠很方便的開發出本身的工具包。這使得Django具備很強的可擴展性。它還強調快速開發和DRY(Do Not Repeat Yourself)原則。

Django基於MVC的設計十分優美:

  • 對象關係映射 (ORM object-relational mapping):以Python類形式定義你的數據模型,ORM將模型與關係數據庫鏈接起來,你將獲得一個很是容易使用的數據庫API,同時你也能夠在Django中使用原始的SQL語句。程序員

  • URL 分派:使用正則匹配URL,你能夠設計任意的URL,沒有框架的特定限定。像你喜歡的同樣靈活。web

  • 模版系統:使用Django強大而可擴展的模板語言,能夠分隔設計、內容和Python代碼。而且具備可繼承性。正則表達式

  • 表單處理:你能夠方便的生成各類表單模型,實現表單的有效性檢驗。能夠方便的從你定義的模型實例生成相應的表單。redis

  • Cache系統:能夠掛在內存緩衝或其它的框架實現超級緩衝 -- 實現你所須要的粒度。sql

  • 會話(session),用戶登陸與權限檢查,快速開發用戶會話功能。shell

  • 國際化:內置國際化系統,方便開發出多種語言的網站。

  • 自動化的管理界面:不須要你花大量的工做來建立人員管理和更新內容。Django自帶一個ADMIN site  

  

學習直達

 


 

Django官網  Django中文文檔  Django基礎教程  The Django Book  Django-redis中文文檔 

 

 項目建立


 

接下來你會獲得兩種方式建立項目:

1.經過命令行進入到你想建立項目的目錄下輸入

  django-admin startproject test1[test1爲你要建立的項目名]

2.建立應用

  python manage.py startapp circle【circle是應用名】

3.創建應用和項目之間的關聯,進行應用註冊,在settings.py中INSTALLED_APPS中添加應用名

 運行本身開發的第一個Web項目輸入命令 python manage.py runserver,當顯示下面圖片的信息說明運行成功

 

 那麼接下來就是第二種特別方便的方式-------->pycharm

a.首先點擊File-->New Project-->Django

 

點擊Create就將項目建立完成,很是的簡單方便,一樣你能夠運行這個項目測試一下是否建立的正確

 

 

模型設計


 

  操做數據庫通常狀況都是經過寫SQL語句,那麼不用SQL語句也想操做數據庫須要用到什麼呢?那麼接下來出場的就是ORM框架

ORM框架

  O就是object-對象,R是relation-關係,M是mapping-映射。在ORM框架中,咱們經過類和數據表進行了一個映射,可讓咱們經過類和類對象就能操做所對應的數據表中的數據。ORM的做用:根據設計的類生成數據庫的表

使用Django進行數據庫開發的步驟:

  1.在models.py中定義模型類

  2.遷移

  3.經過類和對象完成數據的增、刪、改、查操做

1.定義模型類

  模型類定義在models.py文件中,繼承自models.Model類

學生模型類已經定義完成了。接下來就須要第二個步驟生成遷移文件

在命令中輸入 python manage.py makemigrations

 打開遷移文件以下圖:

 

接下來咱們須要執行遷移命令:

python manage.py migrate

 

當執行遷移命令後,Django框架會讀取遷移文件自動幫咱們在數據庫中生成對應的表格。

 

Django默認採用sqlite3數據庫,上圖中的db.sqlite3就是Django框架幫咱們自動生成的數據庫文件。 sqlite3是一個很小的數據庫,一般用在手機中,它跟mysql同樣,咱們也能夠經過sql語句來操做它。稍後我會將數據展現到頁面給你們看一下數據的狀況,或者能夠下載sqlite3數據庫有關的軟件查看

完善下面咱們從新複習一下上面的步驟刪除所建的項目重頭仍是作一次而後再完善下學生和學校這兩個類供咱們以後的學習使用

 1 class ClassInfo(models.Model):  2     """班級信息模型類"""
 3     class_name = models.CharField(max_length=20)  4     class_num = models.IntegerField()  5 
 6 
 7 class StudentInfo(models.Model):  8     """學生信息模型類"""
 9     name = models.CharField(max_length=20) 10     age = models.IntegerField() 11     gender = models.BooleanField(default=False) 12     stu_class = models.ForeignKey(ClassInfo,on_delete=models.CASCADE)
models

 

這裏簡單的提一下引用外鍵的一些說明,在2.0之前on_delete=models.CASCADE爲默認值,能夠省略。可是若是你使用的是2.x就必須完整的寫入,on_delete還有一些默認的選項,會在之後單獨討論外鍵的時候詳細說明。

ForeignKey(ClassInfo,on_delete=models.CASCADE)

接下來咱們經過模型類操做數據庫

這裏咱們能夠經過shell模式進行簡單的添加一些數據

進入shell 在命令行中輸入:python manage.py shell

1 # 首先引入test1.models下的類
2 from test1.models import ClassInfo, StudentInfo 3 """
4  這裏提醒一下test1爲你的應用名不是項目名稱 5  若是在導包的時候發現報錯,首先查看一下導入的包名或者類名 6  是否正確。若是都正確,就是有肯能就是你在進入shell以後才編 7  寫的類,這時候退出shell模式,在重新進入一次就能夠了 8 """

接下來查詢一下ClassInfo、StudentInfo中的信息看看會如何顯示

ClassInfo.objects.all()  # 目標結果會返回一個<QuerySet []>由於這裏尚未寫入任何數據

接下來就是經過Python 的shell中插入一條數據

1 c = ClassInfo()  # 建立一個ClassInfo對象
2 c.class_name = '高三·三班'   # 設置名字
3 c.class_num = 66  # 設置班級人數
4 c.save()  # 調用save()方法
5 # 在查詢一下ClassInfo裏的數據
6 ClassInfo.objects.all()  # 目標結果爲<QuerySet [<ClassInfo: ClassInfo object (1)>]>

數據已經插入了,接下來查詢一下id=1的對象數據

1 c = ClassInfo.objects.get(id=1) 2 c  # <ClassInfo: ClassInfo object (1)>
3 c.id  # 1
4 c.class_name  # 高二·三班
5 c.class_num  # 66
6 # 咱們也能夠經過c這個對象修改這條數據裏面的信息
7 c.class_num = 54
8 c.save() 9 c.class_num # 這裏就會返回修改後的數據54

建立一個關聯ClassInfo的StudentInfo的數據

# 建立一個StudentInfo類的對象
s = StudentInfo() s.name = '李雷' s.age = 16 s.stu_class = c s.save() # 班級與學生是一對多的關係,django中提供了關聯的操做方式 # 得到關聯集合:返回當前班級對象的全部學生
c.studentinfo_set.all()  # <QuerySet [<StudentInfo: StudentInfo object (1)>]>

如今這種狀況下想查看一下數據,真的是很不方便,若是在沒有相關數據庫軟件的時候,就只能在Shell中查看嗎?這裏Django還提供了一個後臺管理之類的東西,咱們將數據顯示在哪裏試一下

 

後臺管理


 

使用Django的管理模塊,須要按照以下步驟操做:

  1. 管理界面本地化
  2. 建立管理員
  3. 註冊模型類
  4. 自定義管理頁面

1.管理界面本地化:本地化是將顯示的語言、時間等使用本地的習慣,這裏的本地化就是進行中國化,中國大陸地區使用簡體中文,時區使用亞洲/上海時區,注意這裏不使用北京時區表示。

打開untitled/settings.py文件,找到語言編碼、時區的設置項,將內容改成以下:

LANGUAGE_CODE = 'zh-hans'  # 設置中文
 TIME_ZONE = 'Asia/Shanghai'  # 設置時區

2.建立管理員 

# 建立命令
python manage.py createsuperuser # 接下來就是設置用戶名、郵箱、密碼 # 啓動服務器
python manage.py runserver # 而後能夠打開瀏覽器查看是否成功 # 127.0.0.1:8000/admin/

3.註冊模型類:登陸後臺管理,默認沒有咱們建立的應用定義的模型類,而須要在本身應用中的admin.py文件中註冊,才能夠在後臺管理中看到,並進行增、刪、改、查

打開test1/admin.py文件

1 from django.contrib import admin 2 from test1.models import ClassInfo, StudentInfo 3 
4 
5 # Register your models here.
6 admin.site.register(ClassInfo) 7 admin.site.register(StudentInfo)

在瀏覽器刷新頁面就能夠看見本身test1這個應用被添加進來

4.自定義管理頁面:在列表頁只顯示出了ClassInfo object,對象的其它屬性並無列出來,查看很是不方便。 Django提供了自定義管理頁面的功能,好比列表頁要顯示哪些值。

打開test1/admin.py文件

from django.contrib import admin from test1.models import ClassInfo, StudentInfo # 自定義類
class ClassInfoAdmin(admin.ModelAdmin): list_display = ['id', 'class_name', 'class_num'] class StudentInfoAdmin(admin.ModelAdmin): list_display = ['id', 'name', 'age', 'gender', 'stu_class'] # Register your models here.
admin.site.register(ClassInfo, ClassInfoAdmin) admin.site.register(StudentInfo, StudentInfoAdmin)

 刷新頁面,數據就會顯示出來了

視圖

Django給我提供的管理頁面,咱們沒有寫,若是配置頁面的規則,可是瀏覽器就能找到,這是由於Django默認給咱們陪着了這個頁面的信息,那麼接下來咱們就來了解一下定義視圖,配置URLconf,對於Django的設計框架MVT,用戶在URL中請求的視圖,視圖接受請求後進行處理,並將處理的結果返回給請求者

使用視圖時須要進行兩部操做:

  1.定義視圖函數

  2,配置URLconf

1.定義視圖:視圖就是一個Python函數,被定義在views.py中,視圖有一個必要的參數,request,視圖必須返回HTTPResponse對象,HTTPResponse中的參數內容會顯示在瀏覽器的頁面上

打開test1/views.py,定義視圖:

from django.http import HttpResponse # Create your views here.
def index(request): return HttpResponse('測試')

2.配置URLconf

查找視圖的過程:請求者在瀏覽器中輸入地址,請求到網站後,獲取url信息,而後與URLconf進行匹配,若是匹配成功則調用對應的視圖函數,若是失敗返回404

URLconf包括url規則、視圖兩部分

  • url規則使用正則表達式
  • 視圖就是views.py中定義的函數

 完成URLconf配置

  • 在應用中定義URLconf(這裏你能夠直接複製項目中原有的urls.py到本身的應用中)
  • 在項目中也添加一個URLconf

# untitled項目中的urls.py
from django.contrib import admin from django.urls import path from django.conf.urls import include, url urlpatterns = [ path( 'admin/', admin.site.urls ), url( r'^', include( 'test1.urls' ) ) ]
# test1應用中urls.py
from django.conf.urls import url from test1 import views urlpatterns = [ url(r'^index$', views.index), ]

接下來就在瀏覽器中測試一下

 

 模板

想讓你的頁面精美嗎?那麼模板就起到做用了,想讓你的頁面酷炫嗎?那麼模板就起做用了,想讓你的頁面上天嗎?那麼模板就起做用了

在Django中將前端的內容定義在模板中,而後再把模板交給視圖調用。就能夠完成以上的操做。

建立模板

那麼問題來了,每一個模塊都有本身的歸屬,模板的歸屬在哪裏,若是你是用Pycharm生成的項目,你就會發現有一個空文件夾一直未使用,他的名字就叫 templates

這裏我會在templates裏建立一個和應用名同樣的文件夾,來存儲這個應用所使用的頁面,那麼就讓咱們動手來建立吧

 這樣就算完成了嗎?並無,如今你就須要讓去配製一下它的路徑,讓咱們的程序要到它

首先打開test4/settings.py文件,設置TEMPLATES的DIRS值

 

DIRS': [os.path.join(BASE_DIR, 'templates')],

 定義模板

在你剛剛建立的index.html開始書寫你的網頁

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>index模板</title>
 6 </head>
 7 <body>
 8 <h1>{{ class_name }}</h1>
 9 <ul>
10  {% for class_name in class_list %} 11         <li>{{ class_name }}</li>
12  {% endfor %} 13 </ul>
14 </body>
15 </html>

 

這裏必定會發現一堆亂七八糟的東西,出如今你的視線裏。

<!--在模板中輸出變量,變量多是從視圖中傳遞過來的,也多是在模板中定義的--> {{變量名}} <!--下面就是模板使用代碼段的方式--> {%代碼段%}

既然視圖中能夠傳值過來,那麼怎麼傳?暫時先不告訴你明白下面的內容,你天然就會懂得

視圖調用模板

調用模板的三個步驟:

  1. 找到模板
  2. 定義上下文
  3. 渲染模板

這裏就來找到視圖views.py這個文件調用上面定義的模板文件

from django.http import HttpResponse from django.template import loader # /index
def index(request): # 1.獲取模板
    template = loader.get_template('class_system/index.html') # 2.定義上下文
    context = {'class_name': '二年三班', 'class_list': ['二年一班', '二年二班']} # 3.渲染模板
    return HttpResponse(template.render(context))

刷新你的瀏覽器,會給你一個驚喜

那麼每次都須要寫的那麼煩嗎?你學的但是Python,那麼固然並不用

視圖調用模板要執行以上三部分,因而Django提供了一個函數render封裝了以上代碼,方法render包含3個參數

  1. 第一個參數是request對象
  2. 第二個參數爲模板文件路徑
  3. 第三個參數爲字典,表示向模板中傳遞的數據

 

 1 """
 2 from django.http import HttpResponse  3 from django.template import loader  4 
 5 
 6 # /index  7 def index(request):  8  # 1.獲取模板  9  template = loader.get_template('class_system/index.html') 10  # 2.定義上下文 11  context = {'class_name': '班級', 'class_list': ['二年一班', '二年二班', '二年三班']} 12  # 3.渲染模板 13  return HttpResponse(template.render(context)) 14 """
15 from django.shortcuts import render 16 
17 
18 def index(request): 19     context = {'class_name': '驚喜班級', 'class_list': ['二年一班', '二年二班', '二年三班']} 20     return render(request, 'class_system/index.html', context)

刷新頁面有驚喜

下面經過數據庫咱們來鞏固一下上面囉嗦的一堆

在開始寫代碼以前,考慮一下我都須要什麼

  1. 定義視圖
  2. 定義URLconf
  3. 定義模板

定義視圖

修改views.py

""" from django.http import HttpResponse from django.template import loader # /index def index(request): # 1.獲取模板 template = loader.get_template('class_system/index.html') # 2.定義上下文 context = {'class_name': '班級', 'class_list': ['二年一班', '二年二班', '二年三班']} # 3.渲染模板 return HttpResponse(template.render(context)) """
from django.shortcuts import render from class_system.models import ClassInfo def index(request): """顯示班級""" class_list = ClassInfo.objects.all() context = {'class_name': '咱們的青春', 'class_list': class_list} return render(request, 'class_system/index.html', context) def detail(request, cid): """顯示學生詳情""" c = ClassInfo.objects.get(id=cid) student_list = c.studentinfo_set.all() return render(request, 'class_system/detail.html', {'c': c, 'student_list': student_list})

定義URLconf

from django.conf.urls import url from class_system import views urlpatterns = [ url(r'index$', views.index), # \d+ 表示多個數字 也就是匹配index頁面<a href="/{{ c.id }}">返回的頁面地址
    # ()用於分組,將值傳遞給views裏detail中的cid接收
    url(r'(\d+)$', views.detail), ]

 

定義模板

修改templates/class_system/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index模板</title>
</head>
<body>
<h1>{{ class_name }}</h1>
<ul> {% for c in class_list %} <li><a href="/{{ c.id }}">{{ c.class_name}}</a></li> {% endfor %} </ul>
</body>
</html>

添加一個templates/class_system/detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>{{ c.class_name }}</h1>
<ul> {% for student in student_list %} <li> {{ student.name }}:{{ student.age }}:{% if not student.gender == False %}女{% else %}男 {% endif %} </li> {% endfor %} </ul>
</body>
</html>

 -The End-

相關文章
相關標籤/搜索