Django模æ¿ç³»ç»
Django模æ¿ç³»ç»
常ç¨è¯æ³
åªéè¦è®°ä¸¤ç§ç¹æ®ç¬¦å·ï¼
{{ }}å {% %}
åéç¸å ³çç¨{{}}ï¼é»è¾ç¸å ³çç¨{%%}ã
åé
{{ åéå }}
åéåç±åæ¯æ°ååä¸å线ç»æã
ç¹ï¼.ï¼å¨æ¨¡æ¿è¯è¨ä¸æç¹æ®çå«ä¹ï¼ç¨æ¥è·å对象çç¸åºå±æ§å¼ã
å 个ä¾åï¼
viewä¸ä»£ç ï¼
def template_test(request): l = [11, 22, 33] d = {"name": "alex"} class Person(object): def __init__(self, name, age): self.name = name self.age = age def dream(self): return "{} is dream...".format(self.name) Alex = Person(name="Alex", age=34) Egon = Person(name="Egon", age=9000) Eva_J = Person(name="Eva_J", age=18) person_list = [Alex, Egon, Eva_J] return render(request, "template_test.html", {"l": l, "d": d, "person_list": person_list})
模æ¿ä¸æ¯æçåæ³ï¼
{# ålä¸ç第ä¸ä¸ªåæ° #} {{ l.0 }} {# ååå ¸ä¸keyçå¼ #} {{ d.name }} {# å对象çnameå±æ§ #} {{ person_list.0.name }} {# .æä½åªè½è°ç¨ä¸å¸¦åæ°çæ¹æ³ #} {{ person_list.0.dream }}
Filters
è¯æ³ï¼ {{ value|filter_name:åæ° }}
default
{{ value|default: "nothing"}}
å¦ævalueå¼æ²¡ä¼ çè¯å°±æ¾ç¤ºnothing
length
{{ value|length }}
'|'å·¦å³æ²¡æç©ºæ ¼æ²¡æç©ºæ ¼æ²¡æç©ºæ ¼
è¿åvalueçé¿åº¦ï¼å¦ value=['a', 'b', 'c', 'd']çè¯ï¼å°±æ¾ç¤º4.
filesizeformat
å°å¼æ ¼å¼å为ä¸ä¸ª â人类å¯è¯»çâ æ件尺寸 ï¼ä¾å¦ '13 KB'
, '4.1 MB'
, '102 bytes'
, ççï¼ãä¾å¦ï¼
{{ value|filesizeformat }}
å¦æ value æ¯ 123456789ï¼è¾åºå°ä¼æ¯ 117.7 MBã
slice
åç
{{value|slice:"2:-1"}}
date
æ ¼å¼å
{{ value|date:"Y-m-d H:i:s"}}
safe
Djangoç模æ¿ä¸ä¼å¯¹HTMLæ ç¾åJSçè¯æ³æ ç¾è¿è¡èªå¨è½¬ä¹ï¼åå æ¾èæè§ï¼è¿æ ·æ¯ä¸ºäºå®å ¨ãä½æ¯æçæ¶åæ们å¯è½ä¸å¸æè¿äºHTMLå ç´ è¢«è½¬ä¹ï¼æ¯å¦æ们åä¸ä¸ªå 容管çç³»ç»ï¼åå°æ·»å çæç« ä¸æ¯ç»è¿ä¿®é¥°çï¼è¿äºä¿®é¥°å¯è½æ¯éè¿ä¸ä¸ªç±»ä¼¼äºFCKeditorç¼è¾å 注äºHTML修饰符çææ¬ï¼å¦æèªå¨è½¬ä¹çè¯æ¾ç¤ºçå°±æ¯ä¿æ¤HTMLæ ç¾çæºæ件ã为äºå¨Djangoä¸å ³éHTMLçèªå¨è½¬ä¹æ两ç§æ¹å¼ï¼å¦ææ¯ä¸ä¸ªåç¬çåéæ们å¯ä»¥éè¿è¿æ»¤å¨â|safeâçæ¹å¼åè¯Djangoè¿æ®µä»£ç æ¯å®å ¨çä¸å¿ 转ä¹ã
æ¯å¦ï¼
value = "<a href='#'>ç¹æ</a>"
{{ value|safe}}
truncatechars
å¦æå符串å符å¤äºæå®çå符æ°éï¼é£ä¹ä¼è¢«æªæãæªæçå符串å°ä»¥å¯ç¿»è¯ççç¥å·åºåï¼â...âï¼ç»å°¾ã
åæ°ï¼æªæçå符æ°
{{ value|truncatechars:9}}
èªå®ä¹filter
èªå®ä¹è¿æ»¤å¨åªæ¯å¸¦æä¸ä¸ªæ两个åæ°çPythonå½æ°:
- åéï¼è¾å ¥ï¼çå¼ - -ä¸ä¸å®æ¯ä¸ä¸ªå符串
- åæ°çå¼ - è¿å¯ä»¥æä¸ä¸ªé»è®¤å¼ï¼æå®å ¨çç¥
ä¾å¦ï¼å¨è¿æ»¤å¨{{var | fooï¼âbarâ}}ä¸ï¼è¿æ»¤å¨fooå°ä¼ éåévarååæ°âbarâã
èªå®ä¹filter代ç æ件ææ¾ä½ç½®(ååå¿ é¡»æ¯templatetagsçå )ï¼
app01/ __init__.py models.py templatetags/ # å¨app01ä¸é¢æ°å»ºä¸ä¸ªpackage package __init__.py app01_filters.py # 建ä¸ä¸ªåæ¾èªå®ä¹filterçæ件 views.py
ç¼åèªå®ä¹filter
from django import template register = template.Library() @register.filter(name="cut") def cut(value, arg): return value.replace(arg, "") @register.filter(name="addSB") def add_sb(value): return "{} SB".format(value)
使ç¨èªå®ä¹filter
{# å å¯¼å ¥æ们èªå®ä¹filteré£ä¸ªæ件 #} {% load app01_filters %} {# 使ç¨æ们èªå®ä¹çfilter #} {{ somevariable|cut:"0" }} {{ d.name|addSB }}
Tags
for
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul>
for循ç¯å¯ç¨çä¸äºåæ°ï¼
Variable | Description |
---|---|
forloop.counter |
å½å循ç¯çç´¢å¼å¼ï¼ä»1å¼å§ï¼ |
forloop.counter0 |
å½å循ç¯çç´¢å¼å¼ï¼ä»0å¼å§ï¼ |
forloop.revcounter |
å½å循ç¯çååºç´¢å¼å¼ï¼ä»1å¼å§ï¼ |
forloop.revcounter0 |
å½å循ç¯çååºç´¢å¼å¼ï¼ä»0å¼å§ï¼ |
forloop.first |
å½å循ç¯æ¯ä¸æ¯ç¬¬ä¸æ¬¡å¾ªç¯ï¼å¸å°å¼ï¼ |
forloop.last |
å½å循ç¯æ¯ä¸æ¯æåä¸æ¬¡å¾ªç¯ï¼å¸å°å¼ï¼ |
forloop.parentloop |
æ¬å±å¾ªç¯çå¤å±å¾ªç¯ |
for ... empty
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% empty %} <li>空空å¦ä¹</li> {% endfor %} </ul>
if,elifå
else
{% if user_list %} ç¨æ·äººæ°ï¼{{ user_list|length }} {% elif black_list %} é»ååæ°ï¼{{ black_list|length }} {% else %} 没æç¨æ· {% endif %}
å½ç¶ä¹å¯ä»¥åªæifåelse
{% if user_list|length > 5 %} ä¸åº§è±ªåSUV {% else %} é»å 车 {% endif %}
ifè¯å¥æ¯æ and ãorã==ã>ã<ã!=ã<=ã>=ãinãnot inãisãis notå¤æã
with
å®ä¹ä¸ä¸ªä¸é´åé
{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
csrf_token
è¿ä¸ªæ ç¾ç¨äºè·¨ç«è¯·æ±ä¼ªé ä¿æ¤ã
å¨é¡µé¢çform表åéé¢åä¸{% csrf_token %}
è¿ä¸ªæºå¶è·cookieï¼sessionæºå¶åçå·®ä¸é½ï¼ä¸»è¦æ¯ç¨æ¥å¯¹æ°æ®å®å ¨æ§è¿è¡æ ¡éªï¼ 举ä¾:æ¯å¦ä»¥åå¨ç½ç»å®å ¨è¿ä¸æ¯å¾åè¾¾ç年代ï¼æå¾å¤åå é¶è¡çæ¶åå°ä¸ªäººè´¢äº§çéé±¼ç½ç«(å°èªå·±çç½ç«åçè·é¶è¡è½¬è´¦ç½ç«ä¸æ ·)ä½ å¨éé±¼ç½ç«ä¸è¾å ¥è´¦å·å¯ç 转账ç»è°è°æ¶ï¼éé±¼ç½ç«ä¹ä¼å°æ°æ®åç»çæ£çé¶è¡åå°å¤çå°åï¼å¯ä¸ä¸åçå¨äºï¼éé±¼ç½ç«å±ç¤ºç»ä½ ç转账ç»ç®æ è´¦å·èµ·å§åªæ¯ä¸ä¸ªä¼ªæ ç¾ï¼å®çå é¨éèäºä¸ä¸ªåæéé±¼è ææ转账çé¶è¡è´¦æ·ï¼è¿æ ·å°±é æç»åéªè ä¸ç§è½ç¶è½¬è´¦æåä½æ¯é±è½¬å ¥çæ¯ä»äººè´¦æ·ãããç¸ä¼¼ç欺éªæ段è¿æå¾å¤ 为äºè½å¤è¯å«åºæ交ç»æçæ°æ®å°±æ¯ä»æçç½ç«è½¬åè¿æ¥çï¼è¿éå°±ç¨å°äºcsrf_tokenï¼ä½ åªéè¦å¨ä½ éè¦æ交æ°æ®çhtmlå 容ä½å å ä¸{% csrf_token %}è¿ä¸æ®µå 容ï¼Djangoä¼èªå¨çå¨ç¨æ·è®¿é®å°ç¸åºé¡µé¢æ¶ç»è¿ä¸ªé¡µé¢ä¸é¿ä¸²çéªè¯ç ï¼å½å次æ交æ¶Djangoä¹ä¼èªå¨å¸®ä½ è¿è¡éªè¯ï¼å¦ææ è¯ç ä¸æ£ç¡®ï¼ä¼è¿åç»å®¢æ·ç«¯ä¸ä¸ª403表示请æ±æ°æ®æé误æ¥é²æ¢ç¬¬ä¸æ¹éé±¼ç½ç«çå¹²æ°
注é
{# ... #}
注æäºé¡¹
1. Djangoç模æ¿è¯è¨ä¸æ¯æè¿ç»å¤æï¼å³ä¸æ¯æ以ä¸åæ³ï¼
{% if a > b > c %} ... {% endif %}
2. Djangoç模æ¿è¯è¨ä¸å±æ§çä¼å 级大äºæ¹æ³
def xx(request): d = {"a": 1, "b": 2, "c": 3, "items": "100"} return render(request, "xx.html", {"data": d})
å¦ä¸ï¼æ们å¨ä½¿ç¨renderæ¹æ³æ¸²æä¸ä¸ªé¡µé¢çæ¶åï¼ä¼ çåå ¸dæä¸ä¸ªkeyæ¯items并ä¸è¿æé»è®¤ç d.items() æ¹æ³ï¼æ¤æ¶å¨æ¨¡æ¿è¯è¨ä¸:
{{ data.items }}
é»è®¤ä¼ådçitems keyçå¼ã
æ¯æ¿
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> {% block page-css %} {% endblock %} </head> <body> <h1>è¿æ¯æ¯æ¿çæ é¢</h1> {% block page-main %} {% endblock %} <h1>æ¯æ¿åºé¨å 容</h1> {% block page-js %} {% endblock %} </body> </html>
注æï¼æ们é常ä¼å¨æ¯æ¿ä¸å®ä¹é¡µé¢ä¸ç¨çCSSååJSåï¼æ¹ä¾¿å页é¢æ¿æ¢ã
继æ¿æ¯æ¿
å¨å页é¢ä¸å¨é¡µé¢æä¸æ¹ä½¿ç¨ä¸é¢çè¯æ³æ¥ç»§æ¿æ¯æ¿ã
{% extends 'layouts.html' %}
åï¼blockï¼
éè¿å¨æ¯æ¿ä¸ä½¿ç¨{% block xxx %}
æ¥å®ä¹"å"ã
å¨å页é¢ä¸éè¿å®ä¹æ¯æ¿ä¸çblockåæ¥å¯¹åºæ¿æ¢æ¯æ¿ä¸ç¸åºçå 容ã
{% block page-main %} <p>ä¸æ è</p> <p>人æ æ¶</p> <p>é¨éé»æè±æè½</p> {% endblock %}
ç»ä»¶
å¯ä»¥å°å¸¸ç¨ç页é¢å 容å¦å¯¼èªæ¡ï¼é¡µå°¾ä¿¡æ¯çç»ä»¶ä¿åå¨åç¬çæ件ä¸ï¼ç¶åå¨éè¦ä½¿ç¨çå°æ¹æå¦ä¸è¯æ³å¯¼å ¥å³å¯ã
{% include 'navbar.html' %}
éææ件ç¸å ³
{% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" />
å¼ç¨JSæ件æ¶ä½¿ç¨ï¼
{% load static %} <script src="{% static "mytest.js" %}"></script>
æ个æ件å¤å¤è¢«ç¨å°å¯ä»¥å为ä¸ä¸ªåé
{% load static %} {% static "images/hi.jpg" as myphoto %} <img src="{{ myphoto }}"></img>
使ç¨get_static_prefix
{% load static %} <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
æè
{% load static %} {% get_static_prefix as STATIC_PREFIX %} <img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" /> <img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
èªå®ä¹simpletag
åèªå®ä¹filter类似ï¼åªä¸è¿å®è½å¤æ¥åä»»æå¤çåæ°ï¼èfilteråªè½æ¥åä¸ä¸ªå¤é¨åæ°ã使ç¨æ¹å¼ä¸èªå®ä¹filter类似ï¼æ³¨åç»è®°é¨åå®å ¨ä¸æ ·ï¼ä» ä» å¨è£ 饰çæ¶åç¨çæ¯simpletag
å®ä¹æ³¨åsimple tag
@register.simple_tag(name="plus") def plus(a, b, c): return "{} + {} + {}".format(a, b, c)
使ç¨èªå®ä¹simple tag
{% load app01_demo %} {# simple tag #} {% plus "1" "2" "abc" %}
inclusion_tag
å¤ç¨äºè¿åhtml代ç ç段ï¼æ¤æ³æ¯è¾å¸¸ç¨ï¼è£ 饰å¨æ¥æ¶æä½çå¨æhtmlå 容ï¼
示ä¾ï¼
templatetags/my_inclusion.py
from django import template register = template.Library() @register.inclusion_tag('result.html') def show_results(n): n = 1 if n < 1 else int(n) data = ["第{}项".format(i) for i in range(1, n+1)] return {"data": data}
templates/snippets/result.html
<ul> {% for choice in data %} <li>{{ choice }}</li> {% endfor %} </ul>
templates/index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>inclusion_tag test</title> </head> <body> {% load inclusion_tag_test %} {% show_results 10 %} </body> </html>