Django-模板
模板
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" %} 可通过extends继承母版
{% block title %}{% endblock %} - 组件:{% include 'xxx.html' %}
- 值得注意的是,模板的渲染过程是把所有资源整合到一起后,一块渲染。
- include所引用的xxx.html文件中也可以使用{{ xxx }},而这个xxx是原html文件中所的xxx
- views.py
-
def index(request): dic_n = {'name':'哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈'} return render(request,'include_My.html',dic_n)
- include_My.html
-
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>app_1-Index</title> </head> <body> <h1>模板在下边</h1> {% include 'index.html' %} {% include 'index.html' %} {% include 'index.html' %} </body> </html>
- index.html 组件
-
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>app_1-Index</title> </head> <body> <h2>一个很漂亮的模板</h2> <div> {{ name }} </div> </body> </html>
- 效果图:
- 帮助方法:
{{ item.event_start|date:"Y-m-d H:i:s"}}
{{ bio|truncatewords:"30" }}
{{ my_list|first|upper }}
{{ name|lower }}
自定义simple_tag、simple_filter
1、在app中创建templatetags文件夹
2、在其中创建任意 .py 文件,如:xx.py
xx.py
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'Fade Zhao' from django import template from django.utils.safestring import mark_safe register = template.Library() 这· 句必须存在 @register.filter def my_upper(v1, v2): v = v1+' vs '+v2 return v.upper() @register.filter def my_flag(v1,v2): if v1>v2: return True else: return False @register.simple_tag def my_input(id, arg): result = "<input type='text' id='%s' value='%s' />" % (id, arg,) return mark_safe(result)
3、在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名
{% load xx %}
4、使用simple_tag、simple_filter
{% my_input '1' 'XXXX'%} 使用simple_tag时:不限制参数个数,参数跟在函数名之后,用空格分割。却不能在HTML文件中的{%IF ... %}{%else%}中使用,只能在函数内执行
{%'1'|simple_add:'2'%} 使用filter时:参数最多两个,第二个参数紧跟[:]之后,中间不可以有空格、可以在 HTML文件中的{%IF ... %}{%else%}中使用
HTML文件:
{% load xx %} -----------> 【3】 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>app_1-Index</title> </head> <body>
---------- filter -------------- <h1>{{ 'skt'|my_upper:'we' }}</h1>
---------- filter 判断 ---------- <h1> {% if 1|my_flag:2 %} <h1>v1大于v2<h1> {% else %} <h1>v1小于v2<h1> {% endif %} </h1>
--------simple_tag---------- <h1> {% my_input '1' '🎉恭喜WE🎉' %} </h1>
</body> </html>
效果:
5、在settings中配置当前app,不然django无法找到自定义的simple_tag
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
)