Django - 模æ¿ç¸å ³
ä¸.MVCåMTV
ãã1. MVC
ããããM: Model : æ°æ®åº, ååæ°æ®
ããããV: View: è§å¾, ä¿¡æ¯çå±ç¤º
ããããC: Controller: æ§å¶å¨, é»è¾çæ§å¶, è´è´£è°åº¦, ä¼ éæä»¤
ãã2. MTV
ããããM: model: ORMæä½
ããããT: Template: 模æ¿, HTML
ããããV: 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 }}
ããæ³¨: 彿¨¡æ¿ç³»ç»éå°ä¸ä¸ª(.)æ¶,ä¼æç §å¦ä¸ç顺åºå»æ¥è¯¢:
ãã1. å¨åå ¸ä¸æ¥è¯¢
ãã2. 屿§æè æ¹æ³
ãã3. æ°åç´¢å¼
ä¸. è¿æ»¤å¨ Filters
ããè¿æ»¤å¨ç¨æ¥ä¿®æ¹åéçæ¾ç¤ºç»æ
ããè¯æ³: {{value|filter_name:åæ°}}ããåæ°æå¤ä¸ä¸ªããæ³¨æ: '|' 左峿²¡æç©ºæ ¼æ²¡æç©ºæ ¼
defaultãã {{ value|default:"nothing"}} 妿value弿²¡ä¼ çè¯å°±æ¾ç¤ºnothing 注ï¼TEMPLATESçOPTIONSå¯ä»¥å¢å ä¸ä¸ªé项ï¼string_if_invalidï¼'æ¾ä¸å°'ï¼å¯ä»¥æ¿ä»£defaultççä½ç¨ã filesizeformat å°å¼æ ¼å¼å为ä¸ä¸ª â人类å¯è¯»çâ æä»¶å°ºå¯¸ ï¼ä¾å¦ '13 KB', '4.1 MB', '102 bytes', ççï¼ãä¾å¦ï¼ {{ value|filesizeformat }} 妿 value æ¯ 123456789ï¼è¾åºå°ä¼æ¯ 117.7 MBã add ç»åéå åæ° {{ value|add:"2" }} valueæ¯æ°å4ï¼åè¾åºç»æä¸º6ã {{ first|add:second }} 妿firstæ¯ [1,.2,3] ï¼secondæ¯ [4,5,6] ï¼é£è¾åºç»ææ¯ [1,2,3,4,5,6] ã lower å°å {{ value|lower }} upper 大å {{ value|upper}} title æ é¢ {{ value|title }} ljust å·¦å¯¹é½ "{{ value|ljust:"10" }}" rjust å³å¯¹é½ "{{ value|rjust:"10" }}" center å± ä¸ "{{ value|center:"15" }}" length {{ value|length }} è¿åvalueçé¿åº¦ï¼å¦ value=['a', 'b', 'c', 'd']çè¯ï¼å°±æ¾ç¤º4. sliceãã åç {{value|slice:"2:-1"}} first å第ä¸ä¸ªå ç´ {{ value|first }} last åæåä¸ä¸ªå ç´ {{ value|last }} join 使ç¨åç¬¦ä¸²æ¼æ¥å表ãåpythonçstr.join(list)ã {{ value|join:" // " }} truncatechars 妿å符串å符å¤äºæå®çå符æ°éï¼é£ä¹ä¼è¢«æªæãæªæçå符串å°ä»¥å¯ç¿»è¯ççç¥å·åºåï¼â...âï¼ç»å°¾ã åæ°ï¼æªæçåç¬¦æ° {{ value|truncatechars:9}} 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>"
ããèªå®ä¹filter -->ãã
ããããèªå®ä¹è¿æ»¤å¨åªæ¯å¸¦æä¸ä¸ªæä¸¤ä¸ªåæ°çPython彿°:
-
- ããåéï¼è¾å ¥ï¼çå¼ - -ä¸ä¸å®æ¯ä¸ä¸ªå符串
- ããåæ°çå¼ - è¿å¯ä»¥æä¸ä¸ªé»è®¤å¼ï¼æå®å ¨çç¥
ããããä¾å¦ï¼å¨è¿æ»¤å¨{{var | fooï¼âbarâ}}ä¸ï¼è¿æ»¤å¨fooå°ä¼ éåévarååæ°âbarâã
ããããèªå®ä¹filterä»£ç æä»¶ææ¾ä½ç½®ï¼
app01/ __init__.py models.py templatetags/ # å¨app01ä¸é¢æ°å»ºä¸ä¸ªpackage package (pyçä¸ä¸ªå æä»¶) __init__.py app01_filters.py # 建ä¸ä¸ªåæ¾èªå®ä¹filterçpyæä»¶ views.py
ããããç¼åèªå®ä¹fifter
from django import template register = template.Library() @register.filter def fill(value, arg): return value.replace(" ", arg) @register.filter(name="addSB") def add_sb(value): return "{} SB".format(value)
ãããã使ç¨èªå®ä¹fifter
{# å å¯¼å ¥æä»¬èªå®ä¹filteré£ä¸ªæä»¶ #} {% load app01_filters %} {# ä½¿ç¨æä»¬èªå®ä¹çfilter #} {{ somevariable|fill:"__" }} {{ 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: 1.䏿¯æè¿ç»å¤æ
ããããã2. 䏿¯æç®æ°è¿ç® + - * /
{% 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 %}
äº. ç»§æ¿
ããæ¯æ¿: æåå¤ä¸ªé¡µé¢çå ¬å ±é¨å, åå°ä¸ä¸ªHTML页é¢ä¸, å®ä¹å¤ä¸ªblockå
<!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>
ãããç»§æ¿æ¨¡æ¿
#å¨å页é¢ä¸å¨é¡µé¢æä¸æ¹ä½¿ç¨ä¸é¢çè¯æ³æ¥ç»§æ¿æ¯æ¿ã {% extends 'layouts.html' %} æ³ä¿®æ¹çè¯å¯ä»¥éè¿æ¨¡æ¿è®¾ç½®çç±»å {% block page-css %} å¯¹åºæ¨¡æ¿ä¿®æ¹åäºå 容 {% endblock %}
ããå(block)
ããããéè¿å¨æ¯æ¿ä¸ä½¿ç¨{% block xxx %}
æ¥å®ä¹"å"ã
ããããå¨å页é¢ä¸éè¿å®ä¹æ¯æ¿ä¸çblockåæ¥å¯¹åºæ¿æ¢æ¯æ¿ä¸ç¸åºçå 容ã
{% block page-main %} <p>䏿 è</p> <p>äººæ æ¶</p> <p>é¨éé»æè±æè½</p> {% endblock %}
ããç»ä»¶
ãããã䏿®µä¸çµæ´»çHTMLä»£ç æ®µ nav.html
ããããå¯ä»¥å°å¸¸ç¨ç页é¢å 容å¦å¯¼èªæ¡ï¼é¡µå°¾ä¿¡æ¯çç»ä»¶ä¿åå¨åç¬çæä»¶ä¸ï¼ç¶åå¨éè¦ä½¿ç¨çå°æ¹æå¦ä¸è¯æ³å¯¼å ¥å³å¯ã
使ç¨ä¸é¢ä»£ç è°ç¨ {% include 'navbar.html' %}
å . éææä»¶ç¸å ³ã
{% load static %} {% static 'éææä»¶ç¸å¯¹è·¯å¾' %} ââã è·åå°å«åï¼è·åé¢çåæ°è¿è¡æ¼æ¥ {% get_static_prefix %} ââã è·åå°å«å
<link rel="stylesheet" href="{% get_static_prefix %}plugins/bootstrap-3.3.7/css/bootstrap.css">
ããèªå®ä¹inclusion_tag
ããããç¨äºè¿åhtml代ç çæ®µ
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}
<ul> {% for choice in data %} <li>{{ choice }}</li> {% endfor %} </ul>
<!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 my_inclusion %} {% show_results 10 %} </body> </html>
ä¸.å ¶ä»
ãã1. csrf_token
ããè¿ä¸ªæ ç¾ç¨äºè·¨ç«è¯·æ±ä¼ªé ä¿æ¤
ããå¨é¡µé¢çform表åéé¢åä¸{% csrf_token %} å¦å formç请æ±ä¼è¢«æç»
ããä¹åæä»¬æ³¨éäº
# 'django.middleware.csrf.CsrfViewMiddleware',
ç°å¨å¯ä»¥æå¼äº, å¿ é¡»åä¸{% csrf_token %}
ãã2. 注é
ãããã{#........................................#}
ãã3. 注æäºé¡¹
ããããDjangoçæ¨¡æ¿è¯è¨ä¸æ¯æè¿ç»å¤æï¼å³ä¸æ¯æä»¥ä¸åæ³ï¼
{% if a > b > c %} ... {% endif %}
ãããã 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çå¼ã