python3.5 manage.py runserver
1. 建立一個 zqxt_tmpl 項目,和一個 名稱爲 learn 的應用html
django-admin.py startproject zqxt_tmpl cd zqxt_tmpl python manage.py startapp learn
2. 把 learn 加入到 settings.INSTALLED_APPS中python
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'learn', )
3. 打開 learn/views.py 寫一個首頁的視圖數據庫
from django.shortcuts import render def home(request): return render(request, 'home.html')
4. 在 learn目錄下新建一個 templates 文件夾,裏面新建一個 home.htmldjango
默認配置下,Django 的模板系統會自動找到app下面的templates文件夾中的模板文件。服務器
目錄的結構是這樣的:session
zqxt_tmpl ├── learn │ ├── __init__.py │ ├── admin.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── templates │ │ └── home.html │ ├── tests.py │ └── views.py ├── manage.py └── zqxt_tmpl ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py
5. 在 home.html 中寫一些內容app
<!DOCTYPE html>
<html>
<head>
<title>歡迎光臨</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
6. 將視圖函數對應到網址,更改 zqxt_tmpl/urls.py函數
Django 1.7.x 及如下能夠這樣:oop
from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^$', 'learn.views.home', name='home'), # new
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)), ]
Django 1.8.x 及以上:學習
from django.conf.urls import include, url from django.contrib import admin from learn import views as learn_views urlpatterns = [ url(r'^$', learn_views.home, name='home'), url(r'^admin/', include(admin.site.urls)), ]
7. [可選] 建立數據庫表
python manage.py syncdb # Django 1.9.x 以及上要用
python3.5 manage.py makemigrations #爲這些修改建立遷移文件
python3.5 manage.py migrat #將這些改變動新到數據庫中
python3.5 manage.py createsuperuser#建立管理員帳戶,不是必須
建立數據庫雖然本節不會用到,可是可讓一些提示消失(提示你要建立數據庫之類的)
8. 運行開發服務器,看看效果
python manage.py runserver
圖和前面有一節的同樣,不在放上來了,把代碼放上來
模板補充知識:
網站模板的設計,通常的,咱們作網站有一些通用的部分,好比 導航,底部,訪問統計代碼等等
nav.html, bottom.html, tongji.html
能夠寫一個 base.html 來包含這些通用文件(include)
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}默認標題{% endblock %} - PANpan</title>
</head>
<body> {% include 'nav.html' %} {% block content %} <div>這裏是默認內容,全部繼承自這個模板的,若是不覆蓋就顯示這裏的默認內容。</div> {% endblock %} {% include 'bottom.html' %} {% include 'tongji.html' %} </body>
</html>
若是須要,寫足夠多的 block 以便繼承的模板能夠重寫該部分,include 是包含其它文件的內容,就是把一些網頁共用的部分拿出來,重複利用,改動的時候也方便一些,還能夠把廣告代碼放在一個單獨的html中,改動也方便一些,在用到的地方include進去。其它的頁面繼承自 base.html 就行了,繼承後的模板也能夠在 block 塊中 include 其它的模板文件。
好比咱們的首頁 home.html,繼承或者說擴展(extends)原來的 base.html,能夠簡單這樣寫,重寫部分代碼(默認值的那一部分不用改)
{% extends 'base.html' %} {% block title %}歡迎光臨首頁{% endblock %} {% block content %} {% include 'ad.html' %} 這裏是首頁,歡迎光臨 {% endblock %}
注意:模板通常放在app下的templates中,Django會自動去這個文件夾中找。但 假如咱們每一個app的templates中都有一個 index.html,當咱們在views.py中使用的時候,直接寫一個 render(request, 'index.html'),Django 能不能找到當前 app 的 templates 文件夾中的 index.html 文件夾呢?(答案是不必定能,有可能找錯)
Django 模板查找機制: Django 查找模板的過程是在每一個 app 的 templates 文件夾中找(而不僅是當前 app 中的代碼只在當前的 app 的 templates 文件夾中找)。各個 app 的 templates 造成一個文件夾列表,Django 遍歷這個列表,一個個文件夾進行查找,當在某一個文件夾找到的時候就中止,全部的都遍歷完了還找不到指定的模板的時候就是 Template Not Found (過程相似於Python找包)。這樣設計有利固然也有弊,有利是的地方是一個app能夠用另外一個app的模板文件,弊是有可能會找錯了。因此咱們使用的時候在 templates 中創建一個 app 同名的文件夾,這樣就行了。
這就須要把每一個app中的 templates 文件夾中再建一個 app 的名稱,僅和該app相關的模板放在 app/templates/app/ 目錄下面,
例如:項目 zqxt 有兩個 app,分別爲 tutorial 和 tryit
zqxt ├── tutorial │ ├── __init__.py │ ├── admin.py │ ├── models.py │ ├── templates │ │ └── tutorial │ │ ├── index.html │ │ └── search.html │ ├── tests.py │ └── views.py ├── tryit │ ├── __init__.py │ ├── admin.py │ ├── models.py │ ├── templates │ │ └── tryit │ │ ├── index.html │ │ └── poll.html │ ├── tests.py │ └── views.py ├── manage.py └── zqxt ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py
這樣,使用的時候,模板就是 "tutorial/index.html" 和 "tryit/index.html" 這樣有app做爲名稱的一部分,就不會混淆。
列表,字典,類的實例的使用
循環:迭代顯示列表,字典等中的內容
條件判斷:判斷是否顯示該內容,好比判斷是手機訪問,仍是電腦訪問,給出不同的代碼。
標籤:for,if 這樣的功能都是標籤。
過濾器:管道符號後面的功能,好比{{ var|length }},求變量長度的 length 就是一個過濾器。
若是須要將一個或多個變量共享給多個網頁或者全部網頁使用,好比在網頁上顯示來訪者的IP,這個可使用 Django 上下文渲染器 來作。
實例一,顯示一個基本的字符串在網頁上
views.py
# -*- coding: utf-8 -*- from django.shortcuts import render def home(request): string = u"我在學習Django,用它來建網站" return render(request, 'home.html', {'string': string})
在視圖中咱們傳遞了一個字符串名稱是 string 到模板 home.html,在模板中這樣使用它:
home.html
{{ string }}
實例二,講解了基本的 for 循環 和 List內容的顯示
views.py
def home(request): TutorialList = ["HTML", "CSS", "jQuery", "Python", "Django"] return render(request, 'home.html', {'TutorialList': TutorialList})
在視圖中咱們傳遞了一個List到模板 home.html,在模板中這樣使用它:
home.html
教程列表: {% for i in TutorialList %} {{ i }} {% endfor %}
for 循環要有一個結束標記,上面的代碼假如咱們對應的是首頁的網址(本身修改urls.py),顯示在網頁上就是:
簡單總結一下:通常的變量之類的用 {{ }}(變量),功能類的,好比循環,條件判斷是用 {% %}(標籤)
實例三,顯示字典中內容:
views.py
def home(request): info_dict = {'site': u'自強學堂', 'content': u'各類IT技術教程'} return render(request, 'home.html', {'info_dict': info_dict})
home.html
站點:{{ info_dict.site }} 內容:{{ info_dict.content }}
在模板中取字典的鍵是用點info_dict.site,而不是Python中的 info_dict['site'],效果以下:
還能夠這樣遍歷字典:
{% for key, value in info_dict.items %} {{ key }}: {{ value }} {% endfor %}
其實就是遍歷這樣一個 List: [('content', u'自強學堂'), ('site', u'各類IT技術教程')]
實例四,在模板進行 條件判斷和 for 循環的詳細操做:
views.py
def home(request): List = map(str, range(100))# 一個長度爲100的 List return render(request, 'home.html', {'List': List})
假如咱們想用逗號將這些元素鏈接起來:
home.html
{% for item in List %} {{ item }}, {% endfor %}
效果以下:
咱們會發現最後一個元素後面也有一個逗號,這樣確定不爽,若是判斷是否是遍歷到了最後一個元素了呢?
用變量 forloop.last 這個變量,若是是最後一項其爲真,不然爲假,更改以下:
{% for item in List %} {{ item }}{% if not forloop.last%},{% endif %} {% endfor %}
在for循環中還有不少有用的東西,以下:
變量 | 描述 |
---|---|
forloop.counter | 索引從 1 開始算 |
forloop.counter0 | 索引從 0 開始算 |
forloop.revcounter | 索引從最大長度到 1 |
forloop.revcounter0 | 索引從最大長度到 0 |
forloop.first | 當遍歷的元素爲第一項時爲真 |
forloop.last | 當遍歷的元素爲最後一項時爲真 |
forloop.parentloop | 用在嵌套的 for 循環中, 獲取上一層 for 循環的 forloop |
當列表中可能爲空值時用 for empty
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% empty %} <li>抱歉,列表爲空</li> {% endfor %} </ul>
實例五,模板上獲得視圖對應的網址:
# views.py def add(request, a, b): c = int(a) + int(b) return HttpResponse(str(c)) # urls.py urlpatterns = patterns('', url(r'^add/(\d+)/(\d+)/$', 'app.views.add', name='add'), ) # template html {% url 'add' 4 5 %}
這樣網址上就會顯示出:/add/4/5/ 這個網址,假如咱們之後修改 urls.py 中的
r'^add/(\d+)/(\d+)/$'
這一部分,改爲另的,好比:
r'^jiafa/(\d+)/(\d+)/$'
這樣,咱們不須要再次修改模板,當再次訪問的時候,網址會自動變成 /jiafa/4/5/
注意:若是是 Django 1.4 的話,須要在模板開頭加上 {% load url from future %} (若是有 extends 的話,加在 extends 下面)
還可使用 as 語句將內容取別名(至關於定義一個變量),屢次使用(但視圖名稱到網址轉換隻進行了一次)
{% url 'some-url-name' arg arg2 as the_url %} <a href="{{ the_url }}">連接到:{{ the_url }}</a>
實例六,模板中的邏輯操做:
6.一、 ==, !=, >=, <=, >, < 這些比較均可以在模板中使用,好比:
{% if var >= 90 %} 成績優秀,學得不錯 {% elif var >= 80 %} 成績良好 {% elif var >= 70 %} 成績通常 {% elif var >= 60 %} 須要努力 {% else %} 不及格啊,大哥! {% endif %}
and, or, not, in, not in 也能夠在模板中使用
假如咱們判斷 num 是否是在 0 到 100 之間:
{% if num <= 100 and num >= 0 %} num在0到100之間 {% else %} 數值不在範圍以內! {% endif %}
假如咱們判斷 'ziqiangxuetang' 在不在一個列表變量 List 中:
{% if 'ziqiangxuetang' in List %} 自強學堂在名單中 {% endif %}
實例七,模板中 獲取當前網址,當前用戶等:
若是不是在 views.py 中用的 render 函數,是 render_to_response 的話,須要將 request 加入到 上下文渲染器(點擊查看詳細)
Django 1.8 及之後 修改 settings.py
實例七,模板中 獲取當前網址,當前用戶等:
若是不是在 views.py 中用的 render 函數,是 render_to_response 的話,須要將 request 加入到 上下文渲染器(點擊查看詳細)
Django 1.8 及之後 修改 settings.py
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ ... 'django.template.context_processors.request', ... ], }, }, ]
Django 1.7 及之前 修改 settings.py:
若是沒有 TEMPLATE_CONTEXT_PROCESSORS 請自行添加下列默認值:
TEMPLATE_CONTEXT_PROCESSORS = ( "django.contrib.auth.context_processors.auth", "django.core.context_processors.debug", "django.core.context_processors.i18n", "django.core.context_processors.media", "django.core.context_processors.static", "django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages", )
而後再加上 django.core.context_processors.request
TEMPLATE_CONTEXT_PROCESSORS = ( ... "django.core.context_processors.request", ... )
而後在 模板中咱們就能夠用 request 了。
7.1 獲取當前用戶:
{{ request.user }}
若是登錄就顯示內容,不登錄就不顯示內容:
{% if request.user.is_authenticated %} {{ request.user.username }},您好! {% else %} 請登錄,這裏放登錄連接 {% endif %}
7.2.1 獲取當前網址:
{{ request.path }}
7.2.2 獲取當前 GET 參數:
{{ request.GET.urlencode }}
7.2.3 合併到一塊兒用的一個例子:
<a href="{{ request.path }}?{{ request.GET.urlencode }}&delete=1">當前網址加參數 delete</a>
好比咱們能夠判斷 delete 參數是否是 1 來刪除當前的頁面內容。
完整的內容參考官方文檔:https://docs.djangoproject.com/en/1.9/ref/templates/builtins/