在理解了Django框架的基本目錄結構以後,爲了更好的理解框架的流程,咱們經過一個簡易項目來實踐一下,上面的目錄可總結爲:在templates文件夾中寫前端頁面,在settings中進行Django基本配置,在app下的models中寫數據庫相關,在url中寫路徑的對應關係,在views中寫請求處理。css
下面的項目就對這些文件一個個進行書寫。html
首先是各類配置的書寫,一下都是在setting文件中的配置前端
一、理解settings文件中的BASE_DIRpython
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
這句話是獲取項目的根路徑,後面會用到。mysql
二、在最初的時候先禁用csrf相關web
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware', 在此禁用,通常在setting中的47行左右
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
三、確認APP是否註冊正則表達式
若是是在pycharm中建立的APP,通常都會在setting文件中自動註冊,格式以下,若是沒有請手動添加sql
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'book_system.apps.BookSystemConfig', # 這行是app的註冊語句 book_system是app名
]
四、配置template文件夾的位置數據庫
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')] # 在此處配置,該DIRS是一個列表,能夠配置多個
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
五、配置靜態文件存放的位置(本篇可不用此設置)django
# 靜態文件保存目錄的別名
STATIC_URL = '/static/'
# 全部靜態文件(css/js/圖片)都放在我下面你配置的文件夾中,一樣是列表,路徑能夠多個
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
六、配置數據庫相關
這裏編者是用的mysql數據庫,而後鏈接的數據庫名字爲'booksystem',
第一步------在settings文件中寫下以下配置,先將原DATABASE註釋掉
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'booksystem', # 數據庫的名字
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root', # mysql數據庫的用戶名
'PASSWORD': 'root', # 密碼
}
}
第二步------告訴Django用pymysql代替默認的MySQLDB 鏈接MySQL數據庫
在項目/__init__.py文件中,寫下面兩句:
import pymysql
# 告訴Django用pymysql來代替默認的MySQLdb
pymysql.install_as_MySQLdb()
恭喜你,至此你的配置環節已經結束
一、本身動手建立數據庫
create database booksystem;
二、在建立的APP目錄下的models.py下寫下以下類,可在建立的空數據庫中建立一系列的表
from django.db import models # Create your models here. # 出版社類 class Publisher(models.Model): id = models.AutoField(primary_key=True) # 自增的ID主鍵 # 建立一個varchar(64)的惟一的不爲空的字段 name = models.CharField(max_length=64, null=False, unique=True) def __str__(self): return "<Author object>: {}".format(self.name) # 書類 class Book(models.Model): id = models.AutoField(primary_key=True) # 建立一個varchar(64)的惟一的不爲空的字段 tittle = models.CharField(max_length=64, null=False, unique=True) # 和出版者關聯的外鍵字段 publisher = models.ForeignKey(to="Publisher") # 設置書籍鏈接到出版者的外鍵 # 數據庫自動生成的外鍵會自動加上_id def __str__(self): return "<Author object>: {}".format(self.tittle) # 做者類 class Author(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=16, null=False, unique=True) book = models.ManyToManyField(to="Book") # 建立做者表和書籍表多對多的關係 # 多對多的關係會在數據庫中另建立一個新的對應關係表,只存放id的對應關係 def __str__(self): return "<Author object>: {}".format(self.name)
三、使建立的表結構經過django命令映射到數據庫
(1). python manage.py makemigrations --> 把models.py裏面的更改記錄到小本本(相應APP的migrations文件夾下)
(2). python manage.py migrate --> 把更改翻譯成SQL語句,去數據庫執行、
若是在pycharm環境中能夠選擇Tools-->Run manage.py task,而後會在下方彈出以下界面
在後面輸入makemigration [appname]和migrate [appname]能夠達到和如上同樣的結果,執行完畢會在對應的數據庫下建立各類表
三、自動建立的數據表在數據庫中的結構以下
四個主要的表結構以下所示
到這,數據庫結構的建立已經結束,向表中填寫數據便可使用
一、數據庫構建完成後,咱們着手於對訪問地址的解析,寫url的路徑關係
"""bookdjango URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.11/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin from book_system import views urlpatterns = [ url(r'^admin/', admin.site.urls), # 出版社的對應關係 url(r'^publisher_list/', views.publisher_list), url(r'^add_publisher/', views.add_publisher), url(r'^delete_publisher/', views.delete_publisher), url(r'^edit_publisher/', views.edit_publisher), # 書的對應關係 url(r'^book_list/', views.book_list), url(r'^add_book/', views.add_book), url(r'^delete_book/', views.delete_book), url(r'^edit_book/', views.edit_book), # 做者的對應關係 url(r'^author_list/', views.author_list), url(r'^add_author/', views.add_author), url(r'^delete_author/', views.delete_author), url(r'^edit_author/', views.edit_author), url(r'^author_list1/', views.author_list1), ]
url函數的第一個參數爲正則表達式,匹配接收的網址路徑,匹配上了就交給後面第二個參數的函數處理
咱們這裏的函數寫在了APP目錄下的views模塊裏,也就是book_system中,根據須要把import那一行導入改爲本身的APP
二、有了路徑解析函數,下面寫請求處理函數
在book_system下的views.py中寫下路徑處理函數
from django.shortcuts import render, redirect, HttpResponse from book_system import models # Create your views here. def publisher_list(request): # 去數據庫查出全部的出版社,填充到html中,給用戶界面 ret = models.Publisher.objects.all().order_by("id") return render(request, "publisher_list.html", {"publisher_list": ret}) def add_publisher(request): error_msg = "" if request.method == "POST": new_name = request.POST.get("publisher_name") if new_name: models.Publisher.objects.create(name=new_name) return redirect("/publisher_list/") else: error_msg = "出版社的名字不能爲空" return render(request, "add_publisher.html", {"error": error_msg}) def delete_publisher(request): del_id = request.GET.get("id") if del_id: del_obj = models.Publisher.objects.get(id=del_id) # 這裏的id至關於where語句 del_obj.delete() return redirect("/publisher_list/") else: return HttpResponse("您要刪除的數據不存在") def edit_publisher(request): if request.method == "POST": publisher_id = request.POST.get("id") publisher_name = request.POST.get("publisher_name") publisher = models.Publisher.objects.get(id=publisher_id) publisher.name = publisher_name publisher.save() return redirect("/publisher_list/") else: edit_id = request.GET.get("id") print(models.Publisher.objects) edit_obj = models.Publisher.objects.get(id=edit_id) return render(request, "edit_publisher.html", {"edit_obj": edit_obj}) # book的相關試圖操做 def book_list(request): # 去數據庫查出全部的書籍,填充到html中,給用戶界面 ret = models.Book.objects.all().order_by("id") return render(request, "book_list.html", {"book_list": ret}) def add_book(request): error_msg = "" ret = models.Publisher.objects.all() if request.method == "POST": new_name = request.POST.get("book_name") new_publisher_id = request.POST.get("publisher") if new_name: models.Book.objects.create(tittle=new_name, publisher_id=new_publisher_id) return redirect("/book_list/") else: error_msg = "書本的名字不能爲空" return render(request, "add_book.html", { "error": error_msg, "publisher_list": ret }) def delete_book(request): del_id = request.GET.get("id") if del_id: del_obj = models.Book.objects.get(id=del_id) # 這裏的id至關於where語句 del_obj.delete() return redirect("/book_list/") else: return HttpResponse("您要刪除的數據不存在") def edit_book(request): ret = models.Publisher.objects.all() if request.method == "POST": book_id = request.POST.get("id") book_tittle = request.POST.get("book_tittle") book_publisher_id = request.POST.get("publisher") book = models.Book.objects.get(id=book_id) book.tittle = book_tittle book.publisher_id = book_publisher_id book.save() return redirect("/book_list/") else: edit_id = request.GET.get("id") print(models.Book.objects) edit_obj = models.Book.objects.get(id=edit_id) return render(request, "edit_book.html", { "edit_obj": edit_obj, "publisher_list": ret }) def author_list(request): all_author = models.Author.objects.all() return render(request, "author_list.html", {"author_list": all_author}) def add_author(request): error_msg = "" ret = models.Book.objects.all() if request.method == "POST": new_name = request.POST.get("author_name") new_books_id = request.POST.getlist("books") if new_name: new_book_obj = models.Author.objects.create(name=new_name) new_book_obj.book.set(new_books_id) # 自動保存,不用save return redirect("/author_list/") else: error_msg = "做者的名字不能爲空" return render(request, "add_author.html", { "error": error_msg, "book_list": ret }) def delete_author(request): del_id = request.GET.get("id") if del_id: models.Author.objects.get(id=del_id).delete() # 這裏的id至關於where語句 return redirect("/author_list/") else: return HttpResponse("您要刪除的數據不存在") def edit_author(request): if request.method == "POST": old_id = request.POST.get("author_id") old_obj = models.Author.objects.get(id=old_id) new_name = request.POST.get("author_name") new_books_id = request.POST.getlist("books") print(new_books_id) # 更新 old_obj.name = new_name old_obj.book.set(new_books_id) # 自動保存,不用save old_obj.save() return redirect("/author_list/") edit_author_id = request.GET.get("id") edit_author_obj = models.Author.objects.get(id=edit_author_id) ret = models.Book.objects.all() return render(request, "edit_author.html", { "author": edit_author_obj, "book_list": ret, }) def author_list1(request): return render(request, "author_list1.html")
有了路徑處理函數還遠遠不夠,還須要html文件來配合顯示
三、一下文件再都存放在項目根目錄下的templates目錄下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>添加做者</title> </head> <body> <h1>添加做者信息</h1> <form action="/add_author/" method="post"> <p> 姓名:<input type="text" name="author_name"> </p> <p> 著做: <select multiple name="books"> {% for book in book_list %} <option value="{{ book.id }}">{{ book.tittle }}</option> {% endfor %} </select> </p> <input type="submit" value="提交"> <p style="color: red;">{{ error }}</p> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>添加書籍</title> </head> <body> <h1>添加書籍信息</h1> <form action="/add_book/" method="post"> <p> 書名:<input type="text" name="book_name"> </p> <p> <select name="publisher"> {% for publisher in publisher_list %} <option value="{{ publisher.id }}">{{ publisher.name }}</option> {% endfor %} </select> </p> <input type="submit" value="提交"> <p style="color: red;">{{ error }}</p> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>添加出版社</h1> <form action="/add_publisher/" method="post"> <input type="text" name="publisher_name"> <input type="submit" value="提交"> <p style="color: red;">{{ error }}</p> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>做者列表</title> </head> <body> {# a標籤指向的位置找的也是urls.py文件中的對應關係的key。並非直接找同級目錄下的文件#} <a href="/add_author/">添加新的做者信息</a> <table border="1"> <thead> <tr> <th>ID</th> <th>姓名</th> <th>做品</th> <th>操做</th> </tr> </thead> <tbady> {% for author in author_list %} <tr> <td>{{ author.id }}</td> <td>{{ author.name }}</td> <td> {% for book in author.book.all %} {{ book.tittle }} {% endfor %} </td> <td> <a href="/delete_author/?id={{ author.id }}">刪除</a> <a href="/edit_author/?id={{ author.id }}">編輯</a> </td> </tr> {% endfor %} </tbady> </table> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>書籍列表</title> </head> <body> {# a標籤指向的位置找的也是urls.py文件中的對應關係的key。並非直接找同級目錄下的文件#} <a href="/add_book/">添加新的書籍信息</a> <table border="1"> <thead> <tr> <th>ID</th> <th>書名</th> <th>出版社名稱</th> <th>操做</th> </tr> </thead> <tbady> {% for book in book_list %} <tr> <td>{{ book.id }}</td> <td>{{ book.tittle }}</td> <td>{{ book.publisher.name }}</td> <td> <a href="/delete_book/?id={{ book.id }}">刪除</a> <a href="/edit_book/?id={{ book.id }}">編輯</a> </td> </tr> {% endfor %} </tbady> </table> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>編輯做者</title> </head> <body> <h1>編輯做者信息</h1> <form action="/edit_author/" method="post"> <input type="text" name="author_id" value="{{ author.id }}" style="display: none"> {{ author.id }} <p> 姓名:<input type="text" name="author_name" value="{{ author.name }}"> </p> <p> 著做: <select multiple name="books"> {% for book in book_list %} {% if book in author.book.all %} <option selected value="{{ book.id }}">{{ book.tittle }}</option> {% else %} <option value="{{ book.id }}">{{ book.tittle }}</option> {% endif %} {% endfor %} </select> </p> <input type="submit" value="提交"> <p style="color: red;">{{ error }}</p> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>編輯書籍信息</title> </head> <body> <h1>編輯書籍信息</h1> <form action="/edit_book/" method="post"> <input type="text" name="id" value="{{ edit_obj.id }}" style="display: none;"> <p> <input type="text" name="book_tittle" value="{{ edit_obj.tittle }}"> </p> {# <input type="text" name="publisher_name" value="{{ edit_obj.name }}">#} <p> <select name="publisher"> {% for publisher in publisher_list %} {% if edit_obj.publisher_id == publisher.id %} <option selected value="{{ publisher.id }}">{{ publisher.name }}</option> {% else %} <option value="{{ publisher.id }}">{{ publisher.name }}</option> {% endif %} {% endfor %} </select> </p> <input type="submit" value="提交"> <p style="color: red;">{{ error }}</p> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>編輯出版社</title> </head> <body> <h1>編輯出版社</h1> <form action="/edit_publisher/" method="post"> <input type="text" name="id" value="{{ edit_obj.id }}" style="display: none;"> <input type="text" name="publisher_name" value="{{ edit_obj.name }}"> <input type="submit" value="提交"> <p style="color: red;">{{ error }}</p> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>出版社列表</title> </head> <body> {# a標籤指向的位置找的也是urls.py文件中的對應關係的key。並非直接找同級目錄下的文件#} <a href="/add_publisher/">添加新的出版社</a> <table border="1"> <thead> <tr> <th>序號</th> <th>ID</th> <th>出版社名稱</th> <th>操做</th> </tr> </thead> <tbady> {% for publisher in publisher_list %} <tr> <td>{{ forloop.counter }}</td> <td>{{ publisher.id }}</td> <td>{{ publisher.name }}</td> <td> <a href="/delete_publisher/?id={{ publisher.id }}">刪除</a> <a href="/edit_publisher/?id={{ publisher.id }}">編輯</a> </td> </tr> {% endfor %} </tbady> </table> </body> </html>
此時能夠點運行,看當作果了,在8000後面加上下方數字後面的list便可操做書籍系統
一、網頁地址欄
相似於在網頁地址欄中輸入127.0.0.1:8000/publisher_list/,尋找的是項目同名目錄下的urls.py中的urlpatterns列表
urlpatterns = [ url(r'^admin/', admin.site.urls), # 出版社的對應關係 url(r'^publisher_list/', views.publisher_list), # 書的對應關係 url(r'^book_list/', views.book_list), # 做者的對應關係 url(r'^author_list/', views.author_list), ]
url函數的第一個參數爲正則表達式,表示匹配127.0.0.1:8000/後面的路徑,而後尋找相應的路徑處理函數,這裏有一個注意的地方就是在瀏覽器輸入尾部帶斜線和不帶斜線的路徑時,都能匹配到結果,例如:輸入127.0.0.1:8000/publisher_list 和 127.0.0.1:8000/publisher_list/ 時都能匹配到url(r'^publisher_list/', views.publisher_list),這不是由於瀏覽器會自動補全,是由於Django中默認配置會補全斜線若是在settings.py中加入APPEND_SLASH = False,這時,地址欄訪問就不會自動補全斜線。
二、views.py裏render返回時尋址
render(request, "publisher_list.html", {"publisher_list": ret})
render函數第二個參數爲settings中TEMPLATES列表"DIRS"下面路勁的相對路徑
三、views.py裏render返回時尋址
redirect("/publisher_list/")
重定向函數,和第一點同樣,尋找的是項目同名目錄下的urls.py中的urlpatterns列表
四、html文件中form表單action尋址
和第一點同樣,尋找的是項目同名目錄下的urls.py中的urlpatterns列表
五、html文件中a標籤尋址
和第一點同樣,尋找的是項目同名目錄下的urls.py中的urlpatterns列表
六、img和script下的src和link下的href
這二者通常都會帶有靜態文件的別名,通常去settings文件下STATIC_URL去尋找
默認值:[ ](空列表)
全部得到代碼錯誤通知的人的郵件地址列表。當DEBUG=False,而且一個視圖引起了異常時,Django將會給這個列表裏的人發一封含有完整異常信息的電子郵件。列表中的每一個項目都應該是(全名,電子郵件地址)的元組。例如:
[('John', 'john@example.com'), ('Mary', 'mary@example.com')]
默認值:[ ](空列表)
這是新手比較困惑的一個配置項。該配置項列表中包含的是Django站點能夠爲之提供服務的主機/域名。也就是哪些主機或IP可以訪問Django服務器!列表裏的全部元素是同級的,並存的
列表中的值能夠是localhost、www.example.com或者.example.com形式的域名。
也能夠是IP地址,好比:137.2.4.一、192.168.1.一、0.0.0.0、127.0.0.1
還能夠是通配符’*’,表示全部外部主機均可以訪問Django。但這種狀況具備安全風險,在線上環境不要使用。
對於0.0.0.0,表示局域網內的主機均可以訪問Django。
當DEBUG爲True和ALLOWED_HOSTS爲空時,默認至關於配置:[‘localhost’, ‘127.0.0.1’, ‘[:: 1]’]。--------------127.0.0.1(IPv4)和[::1](IPv6)。
默認值:True
當設定爲True時,若是請求的URL沒有匹配到URLconf裏面的任何一條URL路由設置,而且沒有以/(斜槓)結束,該請求將重定向到以請求URL加/的URL地址。須要注意的是重定向有可能致使POST提交的數據丟失。
APPEND_SLASH設置只有在安裝了CommonMiddleware中間件時纔會啓用。
# 數據庫配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 數據庫驅動名 'NAME': 'mydatabase', # 數據庫名稱 'USER': 'mydatabaseuser', # 用戶名 'PASSWORD': 'mypassword', # 密碼 'HOST': '127.0.0.1', # 數據庫所在的主機。 'PORT': '3306', # 端口號 } }
其中ENGINE指定使用的數據庫後端。 內建的數據庫後端名稱有:
'django.db.backends.postgresql' 'django.db.backends.mysql' 'django.db.backends.sqlite3' 'django.db.backends.oracle'
Django默認使用sqlite數據庫,以文件的形式存在。當使用sqlite爲數據庫時只須要配置上述NAME屬性爲數據庫文件的完整路徑。指定路徑時,請始終使用前向的斜槓,即便在Windows 上(例如C:/homes/user/mysite/sqlite3.db)。
打開/關閉調試模式。最重要的設置之一!默認值是False,你沒有看錯!只是在settings.py中又幫咱們設置爲True了,打開了調試模式,方便開發者和測試者的!線上部署網站的時候務必設置爲False。
調試模式下能夠顯示錯誤頁面的細節。若你的應用產生了一個異常,Django會顯示追溯細節,包括許多環境變量的元數據, 好比全部當前定義的Django設置。
默認值:’utf-8’
HttpResponse響應對象的默認字符集。
默認值:’text/html’
HttpResponse對象的默認內容類型。
默認值:’webmaster@localhost’
默認的電子郵件發送地址,即發送方。
Django核心配置項!
當前Django項目中啓用的app列表。 每一個元素應該是一個Python的點分路徑,字符串格式:
項目內每一個啓用的app,包括Django內置的contrib都必須在這個列表裏註冊,不然建立數據表、調用功能等等都沒法進行。
一個典型的配置以下:
# app註冊 INSTALLED_APPS = [ 'app1', # 將自定義模塊註冊到項目中 'app2', # 將自定義模塊註冊到項目中 'django.contrib.admin', # admin站點 'django.contrib.auth', # 身份認證系統 'django.contrib.contenttypes', # 內容類型框架 'django.contrib.sessions', # 會話框架 'django.contrib.messages', # 消息框架 'django.contrib.staticfiles', # 靜態文件管理框架 ]
默認值:’en-us’
當前項目所使用的語言。默認爲英語。漢語是zh-hans,千萬不要寫成別的,好比‘chinese’之類!
USE_I18N必須設置爲True才能使LANGUAGE_CODE生效。
默認:’America/Chicago’
時區設置。
注意,這個配置項的值不必定要和服務器的時區一致。例如,一個服務器可上可能有多個Django站點,每一個站點都有一個單獨的時區設置。
若是要設爲中國時間,也就是北京時間,請賦值:TIME_ZONE = ‘Asia/Shanghai’。注意是上海,不是北京,囧!
當USE_TZ爲False時,它將成爲Django存儲全部日期和時間數據時,使用的時區。 當USE_TZ爲True 時,它是Django顯示模板中的時間,解釋表單中的日期,使用的時區。因此,一般咱們都將USE_TZ同時設置爲False!
注:在Windows 環境中,Django不能可靠地交替其它時區。若是你在Windows上運行Django,TIME_ZONE必須設置爲與系統時區一致。
默認值:」(空字符串)
用戶上傳的文件,所在目錄的,文件系統絕對路徑。也就是指示上傳文件放到哪裏。
例如: 「/var/www/example.com/media/」
警告:MEDIA_ROOT和STATIC_ROOT必須設置爲不一樣的值。
默認值:」(空字符串)
MEDIA_URL指向MEDIA_ROOT所指定的media文件,用來管理保存的文件。該URL設置爲非空值時,必須以斜槓「/」結束。
若你打算在模版中使用{{ MEDIA_URL }},必須在TEMPLATES的context_processors設置中添加django.template.context_processors.media。
警告:MEDIA_URL和STATIC_URL必須設置爲不一樣的值。
當前Django項目實例的密鑰。用於提供cryptographic簽名,是一個惟一的而且不可預測的值。
Django模板系統相關的配置。列表中每一項都是一個字典類型數據(相似DATABASE配置),能夠配置模板不一樣的功能。
示例以下
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], # DIRS:定義了一個目錄列表,模板引擎按列表順序搜索這些目錄以查找模板源文件。 'APP_DIRS': True, # APP_DIRS:告訴模板引擎是否應該進入每一個已安裝的應用中查找模板。一般請將該選項保持爲True。 # OPTIONS中包含了具體的後端設置。 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
BACKEND:要使用的模板後端。 內置模板後端有:
'django.template.backends.django.DjangoTemplates' 'django.template.backends.jinja2.Jinja2'
經過將BACKEND設置爲徹底限定路徑(即’mypackage.whatever.Backend’),你可使用第三方提供的模板後端。
OPTIONS中包含了具體的後端設置。
因爲絕大多數引擎都是從文件加載模板的,因此每種模板引擎都包含兩項通用設置:
每種模板引擎後端都定義了一個慣用的名稱做爲應用內部存放模板的子目錄名稱。(例如Django爲它本身的模板引擎指定的是 ‘templates’,爲jinja2指定的名字是‘jinja2’)。尤爲是,django容許你有多個模板引擎後端實例,且每一個實例有不一樣的配置選項。 在這種狀況下你必須爲每一個配置指定一個惟一的NAME .
DTL引擎的OPTIONS配置項中接受如下參數:
OPTIONS={ 'builtins': ['myapp.builtins'], }
默認值:True
這是一個布爾值,指定Django的翻譯系統是否開啓。若是設置爲False,Django會作一些優化,不去加載翻譯機制。
默認值:False
一個布爾值,用於決定是否開啓數據本地化。若是此設置爲True,例如Django將使用當前語言環境的格式顯示數字和日期。
默認值:False
一個布爾值,用來指定是否使用指定的時區(TIME_ZONE)的時間。若爲True, 則Django會使用內建的時區的時間;不然, Django將會使用本地的時間。
若是咱們將TIME_ZONE設置成了Asia/Shanghai, 那麼務必同時將USE_TZ改爲False!
默認值:False
是否在用戶關閉瀏覽器時過時會話。
默認值:None
在DEBUG設置爲False時,也就是線上環境時,Django項目裏的靜態文件(js\css\plugins)會沒法使用。這是,須要運行python manage.py collectstatic,將靜態文件統一收集到一個目錄下。STATIC_ROOT配置的就是該目錄的絕對路徑。
示例:」/var/www/example.com/static/」
這個目錄,剛開始應該是一個空目錄。
默認值:None
引用位於STATIC_ROOT中的靜態文件時使用的網址。
示例:」/static/」或」http://static.example.com/」
該URL設置爲非空值時,必須以斜槓「/」結束。
默認值:None
Django的內置服務器(例如runserver)將使用的WSGI應用程序對象的完整Python路徑。
Django使用WSGI協議與外部進行通訊。
由django-admin startproject xxx命令建立的Django項目,將自動建立一個簡單的wsgi.py模塊,裏面有一個可調用的application變量,WSGI_APPLICATION配置項的值就指向這個application變量。
要使用的中間件列表。Django-admin命令建立的新項目中,settings.py文件裏默認會爲MIDDLEWARE配置項添加一系列Django內置的中間件,咱們保持它不變就行了。
註釋掉MIDDLEWARE 中的’django.middleware.csrf.CsrfViewMiddleware’,由於這句話會進行校驗,容易產生403錯誤。
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
若是要添加本身的配置項,需遵循如下準則:
配置項名稱必須全爲大寫。
不要使用一個已經存在的設置
---------------------