Django(二) url 和 模板
阿新 • • 發佈:2018-09-29
expand datetime 一個 absolute index substring 分組 開發 appear
URL地址說明:
使用url給視圖函數傳參數
在url配置中將正則部分小括號括起來。比如:
url(r‘^time/plus/(\d{1,2})/$‘, views.hours_ahead)
如果有多個參數則用/隔開,參數需要用分組,比如:
url(r‘^time/plus/(\d{1,2})/(\d{1,2})/$‘, views.hours_ahead),
給參數命名,使用正則分組的別名,比如:
url(r‘^time/plus/(?P<time1>\d{1,2})/(?P<time2>\d{1,2})/$‘, views.hours_ahead)
使用分組別名之後,視圖函數的參數必須用分組的別名,但是位置可以不固定。
?
給url取別名,那麽在使用此url的地方可以使用別名。比如:
url(r‘^buy/$‘, views.buy, name=‘buy‘),
url(r‘^login/$‘, views.login, name=‘login‘),
2. 反向解析
在視圖函數中,反向解析url:
from django.shortcuts import render, redirect
from django.urls import reverse
def buy(request):
return redirect(reverse(‘index‘))
return redirect(reverse(‘detail‘, args=[2]))
return redirect(reverse(‘detail‘, kwargs={"id": 2}))
在templates中,使用別名:
{% url ‘detail‘ stu.id %}
?
使用命名空間:
在工程的urls.py文件中,在include時,可以指定命名空間,更加細化的劃分url。比如:
url(r‘^App/‘, include(‘App.urls‘, namespace=‘App‘)),
指定命令空間後,使用反向解析時需要加上命名空間,比如:
在視圖函數中: return redirect(reverse(‘students:index‘))
在templates中: {% url ‘students:detail‘ %}
3. 模板
在Django框架中,模板是可以幫助開發者快速生成呈現給用戶頁面的工具
模板的設計方式實現了我們MVT中VT的解耦,VT有著N:M的關系,一個V可以調用任意T,一個T可以供任意V使用
模板處理分為兩個過程
加載
渲染
模板主要有兩個部分
HTML靜態代碼
模板語言,動態插入的代碼段(挖坑,填坑)
模板中的動態代碼段除了做基本的靜態填充,還可以實現一些基本的運算,轉換和邏輯
?
模板中的變量: 視圖傳遞給模板的數據,遵守標識符規則
語法: {{ var }}
如果變量不存在,則插入空字符串
python manage.py shell: 進入Python環境, 且會自動導入Django配置,建議使用
>>> python manage.py shell # 進入python環境
>>> from django import template
>>> t = template.Template(‘My name is {{ name }}.‘)
>>> c = template.Context({‘name‘: ‘Nige‘})
>>> print (t.render(c))
My name is Nige.
>>> c = template.Context({‘name‘: ‘Barry‘})
>>> print (t.render(c))
My name is Barry.
模板中的點語法
字典查詢
>>> from django.template import Template, Context
>>> person = {‘name‘: ‘Sally‘, ‘age‘: ‘43‘}
>>> t = Template(‘{{ person.name }} is {{ person.age }} years old.‘)
>>> c = Context({‘person‘: person})
>>> t.render(c)
‘Sally is 43 years old.‘
屬性或者方法
>>> from django.template import Template, Context
>>> import datetime
>>> d = datetime.date(2017, 5, 2)
>>> d.year
2017
>>> d.month
5
>>> d.day
2
>>> t = Template(‘The month is {{ date.month }} and the year is {{ date.year }}.‘)
>>> c = Context({‘date‘: d})
>>> t.render(c)
‘The month is 5 and the year is 2017.‘
>>> from django.template import Template, Context
>>> class Person(object):
... def __init__(self, first_name, last_name):
... self.first_name, self.last_name = first_name, last_name
>>> t = Template(‘Hello, {{ person.first_name }} {{ person.last_name }}.‘)
>>> c = Context({‘person‘: Person(‘John‘, ‘Smith‘)})
>>> t.render(c)
‘Hello, John Smith.‘
方法不能有參數。
>>> from django.template import Template, Context
>>> t = Template(‘{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}‘)
>>> t.render(Context({‘var‘: ‘hello‘}))
‘hello -- HELLO -- False‘
>>> t.render(Context({‘var‘: ‘123‘}))
‘123 -- 123 -- True‘
列表,使用索引,不允許負索引
>>> from django.template import Template, Context
>>> t = Template(‘Item 2 is {{ items.2 }}.‘)
>>> c = Context({‘items‘: [‘apples‘, ‘bananas‘, ‘carrots‘]})
>>> t.render(c)
‘Item 2 is carrots.‘
模板中的小弊端,調用對象的方法,不能傳遞參數
?
模板中的標簽
語法 {% tag %}
作用
1. 加載外部傳入的變量
2. 在輸出中創建文本
3. 控制循環或邏輯
if 語句:
格式:
if單分支
{% if 表達式 %}
語句
{% endif %}
if雙分支
{% if 表達式 %}
語句
{% else %}
語句
{% endif %}
if多分支
{% if 表達式 %}
語句
{% elif 表達式 %}
語句
{% else %}
語句
{% endif %}
判斷true或false
{% if today_is_weekend %}
<p>Welcome to the weekend!</p>
{% endif %}
使用 and or not,可結合使用,and和or中 and具有更高優先權。
{% if athlete_list and coach_list %}
<p>Both athletes and coaches are available.</p>
{% endif %}
{% if not athlete_list %}
<p>There are no athletes.</p>
{% endif %}
{% if athlete_list or coach_list %}
<p>There are some athletes or some coaches.</p>
{% endif %}
{% if not athlete_list or coach_list %}
<p>There are no athletes or there are some coaches.</p>
{% endif %}
?
{% if athlete_list and not coach_list %}
<p>There are some athletes and absolutely no coaches.</p>
{% endif %}
使用多個相同的邏輯操作關鍵字也是允許的,比如:
{% if athlete_list or coach_list or parent_list or teacher_list %}
使用 in和not in,
{% if "bc" in "abcdef" %}
This appears since "bc" is a substring of "abcdef"
{% endif %}
{% if user not in users %}
If users is a list, this will appear if user isn‘t an element of the list.
{% endif %}
使用 is 和 is not
{% if somevar is True %}
This appears if and only if somevar is True.
{% endif %}
?
{% if somevar is not None %}
This appears if somevar isn‘t None.
{% endif %}
for 語句:
{% for 變量 in 列表 %}
語句1
{% empty %}
語句2
{% endfor %}
當列表為空或不存在時,執行empty之後的語句
{{ forloop.counter }} 表示當前是第幾次循環,從1數數
{% for item in todo_list %}
<p>{{ forloop.counter }}: {{ item }}</p>
{%endfor %}
{{ forloop.counter0}}表示當前是第幾次循環,從0數數
{{ forloop.revcounter}}表示當前是第幾次循環,倒著數數,到1停
{{ forloop.revcounter0}}表示當前第幾次循環,倒著數,到0停
{{ forloop.first }} 是否是第一個 布爾值
{% for object in objects %}
{% if forloop.first %}
<li class="first">
{% else %}
<li>
{% endif %}
{{ object }}</li>
{% endfor %}
{{ forloop.last }} 是否是最後一個 布爾值
{% for link in links %}
{{ link }}{% if not forloop.last %} | {% endif %}
{% endfor %}
forloop.parentloop
{% for country in countries %}
<table>
{% for city in country.city_list %}
<tr>
<td>Country #{{ forloop.parentloop.counter }}</td>
<td>City #{{ forloop.counter }}</td>
<td>{{ city }}</td>
</tr>
{% endfor %}
</table>
{% endfor %}
註釋:
單行註釋
{# 被註釋掉的內容 #}
?
多行註釋
{% comment %}
內容
{% endcomment %}
過濾器:
{{ var|過濾器 }}
作用:在變量顯示前修改
add {{ value|add:2 }}
沒有減法過濾器,但是加法裏可以加負數
{{ value|add:-2 }}
lower
{{ name|lower }}
upper
{{ my_list|first|upper }}
截斷:
{{ bio|truncatechars:30 }}
過濾器可以傳遞參數,參數需要使用引號引起來
比如join: {{ students|join:‘=‘ }}
默認值:default,格式 {{var|default:value}}
如果變量沒有被提供或者為False,空,會使用默認值
?
根據指定格式轉換日期為字符串,處理時間的
就是針對date進行的轉換
{{ dateVal | date:‘y-m-d‘ }}
HTML轉義
將接收到的數據當成普通字符串處理還是當成HTML代碼來渲染的一個問題
?
渲染成html:{{ code|safe }}
關閉自動轉義
{% autoescape off%}
code
{% endautoescape %}
打開自動轉義轉義
{% autoescape on%}
code
{% endautoescape %}
模板繼承
block:挖坑
{% block XXX%}
code
{% endblock %}
?
extends 繼承,寫在開頭位置
{% extends ‘父模板路徑‘ %}
?
include: 加載模板進行渲染
{% include ‘模板文件‘ %}
?
?
?
?
Django(二) url 和 模板