1. 程式人生 > >django基礎-HTML模板(模板的執行、模板語言、自定義simple_tag)

django基礎-HTML模板(模板的執行、模板語言、自定義simple_tag)

模板

1、模版的執行

模版的建立過程,對於模版,其實就是讀取模版(其中巢狀著模版標籤),然後將 Model 中獲取的資料插入到模版中,最後將資訊返回給使用者。

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)
from django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Adrian'})
print t.render(c)
複製程式碼

import datetime
from django import template
import DjangoDemo.settings

now = datetime.datetime.now()
fp = open(settings.BASE_DIR+'/templates/Home/Index.html')
t = template.Template(fp.read())
fp.close()
html = t.render(template.Context({'current_date': now}))
return HttpResponse(html

複製程式碼 複製程式碼

from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime

def current_datetime(request):
now = datetime.datetime.now()
t = get_template('current_datetime.html')
html = t.render(Context({'current_date': now}))
return HttpResponse(html)

複製程式碼
return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))

2、模版語言

模板中也有自己的語言,該語言可以實現資料展示

  • {{ item }}
  • {% for item in item_list %}  <a>{{ item }}</a>  {% endfor %}
      forloop.counter
      forloop.first
      forloop.last 
  • {% if ordered_warranty %}  {% else %} {% endif %}
  • 母板:{% block title %}{% endblock %}
    子板:{% extends "base.html" %}
       {% block title %}{% endblock %}
  • 幫助方法:管道符後面接的是格式或者條件,這種是filter方式,
    {{ item.event_start|date:"Y-m-d H:i:s"}}
    {{ bio|truncatewords:"30" }}
    {{ my_list|first|upper }}
    {{ name|lower }}
  • 還有一種自定義filter,和自定義sumple_tag的不同是隻能傳兩個引數,而且用{{}}表示,而simple_tag是用{% %}的,

呼叫模板:extends,只能繼承一個呼叫小外掛:incloud 可以引入多個小外掛,而且引入的外掛也可以渲染,匯入之前,小外掛就已經渲染好了;

 

 

3、自定義simple_tag

缺點:不能作為if條件,優點:引數任意

a、在app中建立templatetags資料夾,名字不能修改成其他的,只能是這個名字

b、在templatetags資料夾下面建立任意 .py 檔案,如:xx.py,名字可以任意取,裡面的裝飾器名字也不能修改,

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/usr/bin/env python #coding:utf-8 from  django  import  template from  django.utils.safestring  import  mark_safe     register  =  template.Library()     @register .simple_tag def  my_simple_time(v1,v2,v3):      return   v1  +  v2  +  v3     @register .simple_tag def  my_input( id ,arg):      result  =  "<input type='text' id='%s' class='%s' />"  % ( id ,arg,)      return  mark_safe(result)

 

c、在使用自定義simple_tag的html檔案中匯入之前建立的 xx.py 檔名,注意是在檔案頂部,但是如果存在extend引入母版的時候,必須放在extend下面,而不是頂部了,

1 { %  load xx  % }

d、使用simple_tag,裡面的引數空格之間一定要有,但是空多少是麼有關係的,

1 2 { %  my_simple_time  1  2  % } { %  my_input  'id_username'  'hide' % }

e、在settings中配置當前app,不然django無法找到自定義的simple_tag  

1 2 3 4 5 6 7 8 9 INSTALLED_APPS  =  (      'django.contrib.admin' ,      'django.contrib.auth' ,      'django.contrib.contenttypes' ,      'django.contrib.sessions' ,      'django.contrib.messages' ,      'django.contrib.staticfiles' ,      'app01' , )

 

4、自定義filter

其他操作和simple_tag一樣,只是裝飾器變成了filter;

後臺書寫格式:

@register .filter def  ceshi(v1,v2,v3):      return   v1  +  v2 +v3   html獲取資料書寫格式: {{% 'v1'|ceshi:v2,v3' %}}

filter優點:應用場景filter可以放到if後面作為條件判斷

{{% if 'malioya'|ceshi:'LS,YH' %}}
{{% endif %}}

缺點:只能傳兩個引數,如果要傳多個引數,後面的引數必須都寫在""裡面,用,隔開,而且也可以傳int型別,但是後臺接受或者運算的時候必須int(),不能出現空格符號;

 

知識點總結:

更多見文件:https://docs.djangoproject.com/en/1.10/ref/templates/language/