Django是一款Python web開發框架,如何形容它 咱們能夠看下官方給的定義:
Django makes it easier to build better Web apps more quickly and with less code.
(Django使得構建更好的Web應用程序更簡單,代碼更少。)
Django框架是美國World Company的工程師Adrian Holovaty和Simon Willison在開發其公司運行的新聞網站(LJWorld.com、Lawrence.com、KUsports.com ) 過程當中,逐漸完善豐富而成,2005年開源,是迄今爲止Python界名氣最大的Web框架。html
Django這個詞來自吉普賽語,D不發音,中文一般翻爲姜戈,不過也有人至關搞笑的稱爲強哥
python
Django框架取名於20世紀三十年代法國著名的爵士吉他手 Django Reinhardt —— 迄今爲止最偉大的吉他手之一,儘管他的左手只有三個指頭mysql
#驗證Django成功安裝 >>> import django >>> print(django.get_version()) 1.8
上面咱們已經經過pip包管理工具成功安裝django,下面咱們來使用它建立第一個項目:
django-admin startproject pro_1 會在指定目錄下建立一個pro_1的文件夾,咱們來解讀下目錄結構linux
pro_1 -----pro_1 #整個項目的容器文件夾,這個名稱能夠隨意起 -------__init__.py #這個文件告訴python這個目錄是一個包 -------settings.py #該Django項目的配置/設置 -------urls.py #Django項目的總路由管理文件 -------wsgi.py #一個兼容的web服務器入口,在項目運行發佈的時候用到 -----manage.py #一個實用的命令行工具,可讓咱們以各類方式和Django項目進行交互
爲了更好的理解MVT,咱們首先來解讀下MVC,MVC 由(試圖View/控制器Controller/模型Model)組成,在咱們實際應用中,模型(Model)用來處理應用程序數據邏輯,視圖(V)用來處理咱們從M拿過來的數據,控制器(C)定義程序行爲選擇相應的視圖
大部分開發語言中都有MVC框架,MVC框架的核心思想是解耦,下降各功能模塊之間的耦合性,方便變動,更容易重構代碼,最大程度上實現代碼的重用
web
MVT基於MVC,並在MVC的基礎上作了更細的劃分,區別主要在於C 和 T ,C以前是控制器,如今變成了Template,把C融入到了View裏。
MVT模式包含:試圖(View)負責業務邏輯,並在適當時候調用Model和Template 模板(Template)負責如何把頁面展現給用戶 模型(Model)處理應用程序數據邏輯正則表達式
上面一系列的鋪墊後,咱們來開始經過Django完成一個完整的項目(本項目案例採用的是官方提供的投票應用)sql
1.建立項目 django-admin startproject mysite
2.配置數據庫 setting.py
默認狀況下使用的是SQLite,你不須要額外安裝其餘內容,SQLite包含在Python中,若是你會其餘的數據庫也能夠在 database binding中配置(咱們這個項目採用SQLite)shell
#建立完項目後默認寫法 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } #如需變動修改ENGINE爲 'django.db.backends.mysql'或'django.db.backends.oracle'
3.啓動服務器
瞭解了項目的結構之後,咱們來驗證下Django項目是否正常運行 python manage.py runserver
接下來打開瀏覽器輸入http://127.0.0.1:8000/
當你看到和上圖同樣的效果就已經執行起來了,若是你的8000被佔用,能夠指定一個端口
python manage.py runserver 8080
4. 建立應用
項目已經有了,咱們須要開始進行加工了,咱們須要建立一個具體的應用來完成,項目相似一個大的文件夾,而應用是一個具體的文件,一個項目下面能夠包含N個應用,一個應用也能夠運用到多個項目中去就是這個道理
建立應用程序,這裏要注意咱們的目錄仍是在項目的目錄下才能夠:
python manage.py startapp polls
建立完成後,會生成的目錄結構以下:數據庫
polls/ __init__.py admin.py migrations/ __init__.py models.py tests.py views.py
5.建立模型
Django模型是與數據庫設計相對應,其實數據庫也有本身的SQL語句,假設咱們不瞭解數據庫語句如何操做數據庫,這就Django模型的做用,Django把數據庫的語法轉換成Python的語法形式,咱們只要編寫Python代碼,Django會把Python代碼翻譯成對應數據庫操做語言。django
需求:咱們來分析下投票應用,咱們將建立兩個模型: Question和Choice。Question對象具備一個question_text(問題)屬性和一個publish_date(發佈時間)屬性。 Choice有兩個字段:選擇的內容和選擇的得票統計。 每一個Choice與一個Question關聯。
模型代碼編寫在polls/models.py文件中
from django.db import models class Question(models.Model): #CharField來表示字符串,max_length 參數則指定 question_text 容許的最大長度 question_text = models.CharField(max_length=200) #DateTimeField時間類型 pub_date = models.DateTimeField('date published') class Choice(models.Model): #ForeignKey表示一種一對多的關聯關係 question = models.ForeignKey(Question) choice_text = models.CharField(max_length=200) #IntegerField 整數類型 votes = models.IntegerField(default=0)
更多的數據類型能夠看下官網文檔https://docs.djangoproject.co...
6.遷移操做
咱們已經編寫了投票應用的數據庫模型代碼,可是數據庫並無真實建立,由於這還只是python代碼,須要經過Django把它翻譯成數據庫認識的代碼,才能執行。
執行後Django會自動完成兩個動做,1.爲該應用建立數據庫表(create table語句)2.建立一個訪問數據庫的python api
首先咱們要把建立好的polls應用告訴項目,打開settings.py文件,修改INSTALLED_APPS
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'polls' )
下面咱們執行 python manage.py makemigrations polls
經過執行makemigrations告訴Django,對模型作了什麼更改,Django接收到以後在migrations下生成一個0001_initial.py文件,這個文件裏面就是記錄咱們對模型作了哪些修改
#0001_initial.py文件 # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models, migrations class Migration(migrations.Migration): dependencies = [ ] operations = [ migrations.CreateModel( name='Choice', fields=[ ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), ('choice_text', models.CharField(max_length=200)), ('votes', models.IntegerField(default=0)), ], ), migrations.CreateModel( name='Question', fields=[ ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), ('question_text', models.CharField(max_length=200)), ('pub_date', models.DateTimeField(verbose_name='date published')), ], ), migrations.AddField( model_name='choice', name='question', field=models.ForeignKey(to='polls.Question'), ), ]
上面文件看不懂,沒有關係,並不要求你們去閱讀它,若是你懂數據庫的sql語句,咱們能夠經過下面指令來看下剛剛的Django爲咱們作了什麼 python manage.py sqlmigrate blog 0001
不懂SQL就能夠跳過這段了,懂SQL的同窗會發現生成的代表和咱們定義的不一樣,如下列了幾個說明點:
接下來很關鍵,由於上面步驟下來其實數據庫尚未建立,執行python manage.py migrate
執行的過程經過檢測剛剛在migrations下生成的文件,知道咱們對數據要作哪些操做翻譯後執行
migrate命令會找出全部尚未被應用的遷移文件(Django使用數據庫中一個叫作django_migrations的特殊表來追蹤哪些遷移文件已經被應用過),而且在你的數據庫上運行它們 —— 本質上來說,就是使你的數據庫模式和你改動後的模型進行同步。
遷移功能很是強大,可讓你在開發過程當中不斷修改你的模型而不用刪除數據庫或者表而後再從新生成一個新的 —— 它專一於升級你的數據庫且不丟失數據
模型變動的三個步驟:
修改你的模型(在models.py文件中)。
運行python manage.py makemigrations ,爲這些修改建立遷移文件
運行python manage.py migrate ,將這些改變動新到數據庫中
7.經過Django提供的API操做數據庫
python manage.py shell
一旦你創建好數據模型,Django 會自動爲你生成一套數據庫抽象的API,可讓你建立、檢索、更新和刪除對象。
好像並看出來查詢的內容是什麼,咱們來修改下models
class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') def __str__(self): return self.question_text
再來查詢看下
固然除了上面列的基礎的增刪改查操做之外,其餘的方法能夠看官網https://docs.djangoproject.co...
Django Admin後臺
Django根據前面縮寫的模型文件徹底自動地生成管理後臺,通常狀況下後臺都是由網站管理員使用,進入admin後臺咱們首先須要建立一個超級管理員帳號,運行 python manage.py createsuperuser 命令新建
這個地方對於以前沒有用過linux的人有一個大坑,就是輸入密碼的時候,並不會顯示出來
接下來咱們啓動開發服務器 python manage.py runserver
打開瀏覽器訪問http://127.0.0.1:8000/admin/
輸入剛剛填寫的帳號密碼登陸進去後的操做界面以下:
經過上圖咱們發現能夠編輯的Groups、Users它們是由django.contrib.auth提供的,這個認證框架集成在Django中,如何讓咱們本身的應用也能夠編輯,還須要配置一下
打開amdin.py
from django.contrib import admin from .models import Question,Choice # Register your models here. admin.site.register(Question) admin.site.register(Choice)
而後你就能夠經過這個管理後臺去進行操做了
Web引用的交互過程其實就是HTTP請求與響應的過程
在Django中,網頁的頁面和其餘內容都是由視圖來傳遞的(視圖對WEB請求進行迴應)。每一個視圖都是由一個簡單的Python函數(或者是基於類的視圖的方法)表示的。Django經過檢查請求的URL(準確地說,是URL裏域名以後的那部分)來選擇使用哪一個視圖。
在咱們的投票應用中,將有如下四個視圖:
編寫視圖,在views.py文件中輸入
from django.http import HttpResponse def index(request): return HttpResponse("Hello, world. You're at the polls index.")
爲了可以調用視圖,咱們須要把視圖映射到URL上,咱們在polls文件夾下建立一個 urls.py配置
from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.index, name='index'), ]
下一步,咱們須要從主urls.py中配置
#坑點:注意urlpaterns前面的空格 urlpatterns = [ url(r'^admin/', include(admin.site.urls)), url(r'^polls/', include('polls.urls')), ]
訪問http://127.0.0.1:8000/polls/便可看到頁面輸出Hello, world. You're at the polls index.
這個地方配置的url有4個參數:
咱們來寫一個帶參數的視圖
首先修改views.py
from django.http import HttpResponse def index(request): return HttpResponse("Hello, world. You're at the polls index.") def detail(request, question_id): return HttpResponse("You're looking at question %s." % question_id) def results(request, question_id): response = "You're looking at the results of question %s." return HttpResponse(response % question_id) def vote(request, question_id): return HttpResponse("You're voting on question %s." % question_id)
修改polls/urls.py
urlpatterns = [ # ex: /polls/ url(r'^$', views.index, name='index'), # ex: /polls/5/ url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), # ex: /polls/5/results/ url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'), # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'), ]
來實現看看能不能捕獲到咱們的參數http://127.0.0.1:8000/polls/21/
這是一個華麗的分割線,上面都是視圖的小菜,如今來開始進入視圖的正題了,咱們須要視圖顯示數據這個應該怎麼作
#修改views.py文件的index from django.http import HttpResponse from .models import Question def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] output = ', '.join([p.question_text for p in latest_question_list]) return HttpResponse(output)
訪問http://127.0.0.1:8000/polls/ 能夠看到在Admin後臺添加的數據
上面視圖出來的數據了,頁面醜麼?醜
咱們應該怎麼改變頁面的外觀,Django提供了模板系統,經過建立一個視圖可以調用的模板,將頁面的設計從Python中分離出來。首先在polls目錄下建立一個叫templates的文件裏,django將在這裏查找模板,爲了更好的重用咱們在templates下建立polls文件夾,再建立index.html
路徑目錄爲:polls/templates/polls/index.html
在index.html中插入代碼
{% if latest_question_list %} <ul> {% for question in latest_question_list %} <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li> {% endfor %} </ul> {% else %} <p>No polls are available.</p> {% endif %}
修改views.py
from django.http import HttpResponse from django.template import RequestContext, loader from .models import Question def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] template = loader.get_template('polls/index.html') context = RequestContext(request, { 'latest_question_list': latest_question_list, }) return HttpResponse(template.render(context))
此次再來運行,將你的瀏覽器指向‘/polls’來加載這個頁面,頁面樣式也有了
上面代碼是否是太過繁瑣,咱們能夠修改下views.py
from django.shortcuts import render from .models import Question def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] context = {'latest_question_list': latest_question_list} return render(request, 'polls/index.html', context)
render()函數將請求對象做爲它的第一個參數,模板的名字做爲它的第二個參數,一個字典做爲它可選的第三個參數。 它返回一個HttpResponse對象,含有用給定的context 渲染後的模板。
如今來處理下詳情頁面的視圖,首先建立detail.html (polls/templates/polls/detail.html)頁面插入內容
<h1>{{ question.question_text }}</h1> <ul> {% for choice in question.choice_set.all %} <li>{{ choice.choice_text }}</li> {% endfor %} </ul>
處理views.py下的detail
def detail(request, question_id): try: question = Question.objects.get(pk=question_id) except Question.DoesNotExist: raise Http404("Question does not exist") return render(request, 'polls/detail.html', {'question': question})
當你訪問列表頁面http://127.0.0.1:8000/polls/ 點擊標題既能夠進入看到詳情,頁面的樣式我並無太多的CSS,樣式部分咱們能夠本身補充