python Django教程 之模板渲染、循環、條件判斷、經常使用的標籤、過濾器

python3.5 manage.py runserver

 

   python Django教程 之模板渲染、循環、條件判斷、經常使用的標籤、過濾器

1、Django模板渲染模板

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做爲名稱的一部分,就不會混淆。

 

2、Django模板中的循環,條件判斷,經常使用的標籤,過濾器

  1. 列表,字典,類的實例的使用

  2. 循環:迭代顯示列表,字典等中的內容

  3. 條件判斷:判斷是否顯示該內容,好比判斷是手機訪問,仍是電腦訪問,給出不同的代碼。

  4. 標籤:for,if 這樣的功能都是標籤。

  5. 過濾器:管道符號後面的功能,好比{{ 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/

相關文章
相關標籤/搜索