博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django template
阅读量:6830 次
发布时间:2019-06-26

本文共 10543 字,大约阅读时间需要 35 分钟。

一、模板基本元素

  1、例子程序

    1)urls.py中新增部分

from django.conf.urls import patterns, url, includeurlpatterns = patterns('',                      #...                      (r'^template_use/$', 'django_web_app.views.template_use'),)

    2)views.py中新增部分

def template_use(request):    person_name='jimfeng'    company='fuyoo'    ship_date=datetime.datetime.now()    item_list=[]    item_list[0:0] = ['aaa']    item_list[0:0] = ['bbb']    item_list[0:0] = ['ccc']    item_list.reverse();    ordered_warranty=True    dic = {
'person_name':person_name, 'company':company,'ship_date':ship_date, 'item_list':item_list,'ordered_warranty':ordered_warranty} return render_to_response('template_use.html', dic)

    3)template_use.html

Ordering notice

Ordering notice

Dear {

{ person_name }},

Thanks for placing an order from {

{ company }}. It's scheduled toship on {
{ ship_date|date:"F j, Y" }}.

Here are the items you've ordered:

    {
    % for item in item_list %}
  • {
    { item }}
  • {
    % endfor %}
{
% if ordered_warranty %}

Your warranty information will be included in the packaging.

{
% else %}

You didn't order a warranty, so you're on your own when the products inevitably stop working.

{
% endif %}

Sincerely,

{
{ company }}

   4)运行结果:

    

  2、基本元素

   1)变量

      {

{变量名}}

     eg:{

{ person_name }}

   2)标签

      {%标签名  变量名%}或{%标签名%}

     eg:

{% if ordered_warranty %}   #.....{
% else %} #.....{
% endif %}

    3)过滤器

    {

{变量名|过滤器名:过滤器参数}}

    eg:{

{ ship_date|date:"F j, Y" }}

   django模板标签,过滤器的详细参考:

        

  3、独立的python代码中使用django模板系统

    步骤:a)创建template对象

       b)创建contex对象

       c)调用模板对象的render()方法,将template中的变量替换为context中的值。

    1)简单的模板渲染:   

def template_use(request):    #创建模板    t = template.Template('My name is {
{ name }}, ship_date is {
{ship_date}}') #创建context c = template.Context({
'name': '普罗米小斯', 'ship_date': datetime.date(2009, 4, 2) }) #template调用render方法,将变量替换为context传进来的值 info_str=t.render(c)#返回的是unicode对象,而不是普通字符串 html = "info_str: %s." % info_str return HttpResponse(html)

    运行结果:

    

   2)较复杂的模板渲染

def template_use(request):    #创建模板    #三个引号来标识文本,这样可以包含多行    raw_template = """

Dear {

{ person_name }},

Thanks for placing an order from {

{ company }}. It's scheduled to ship on {
{ ship_date|date:"F j, Y" }}.

{% if ordered_warranty %}

Your warranty information will be included in the packaging.

{% else %}

You didn't order a warranty, so you're on your own when the products inevitably stop working.

{% endif %}

Sincerely,

{
{ company }}

""" t = template.Template(raw_template) #创建context c = template.Context({
'person_name': '普罗米小斯', 'company': 'Fuyoo', 'ship_date': datetime.date(2009, 4, 2), 'ordered_warranty': False }) #template调用render方法,将变量替换为context传进来的值 info_str=t.render(c)#返回的是unicode对象,而不是普通字符串 html = "info_str: %s." % info_str return HttpResponse(html)

   运行结果:

   

   3)1个template多个context分别渲染的常用方式

def template_use(request):    t = template.Template('Hello, {
{ name }}')#只需创建一次template name_list=('John', 'Julie', 'Pat') for name in name_list: info_str=t.render(template.Context({
'name': name})) print info_str html = "info_str:" return HttpResponse(html)

    运行结果:(控制台输出)

   

二、模板常用功能

  1、Context传递不同类型参数,template的对应访问方式

class Person(object):    def __init__(self, name, age):        self.name,self.age = name,agedef template_use(request):    #字典对象作为context传递的参数,template访问字典的"键"    t_dic = template.Template('用户名:{
{ person.name }},年龄:{
{person.age}}') person_dic = {
'name': 'Sally', 'age': 43} person_info_dic=t_dic.render(template.Context({
'person': person_dic})) print person_info_dic #自定义类的对象作为context传递的参数,template访问对象属性 t_class = template.Template('用户名:{
{ person.name }},年龄:{
{person.age}}') person_class =Person('aaa',22) person_info_class=t_class.render(template.Context({
'person': person_class})) print person_info_class #对象作为context传递的参数,template调用对象的方法 t_class_method=template.Template('原始字符串:{
{info_str}}, 大写字符串:{
{info_str.upper}}') output_info=t_class_method.render(template.Context({
'info_str': 'hello'})) print output_info #列表作为context传递的参数,template访问列表索引号 t_list=template.Template('索引号为2的用户名:{
{name_list.2}}') name_list=['name000','name001','name002','name003','name004'] output_info=t_list.render(template.Context({
'name_list':name_list})) print output_info html = "info_str:" return HttpResponse(html)

   运行结果:

   

   2、Context中参数的增、删

def template_use(request):    c=template.Context({                'name000':'aaa',                'name001':'bbb',                'name002':'ccc'    })    del c['name001']    c['name003'] = 'ddd'    for item in c:        print item    html = "info_str:"    return HttpResponse(html)

    运行结果:

    

   3、模板中的常用标签

    1)if/else标签中的布尔值

       所有为False的情形:

        a)空列表:[]

        b)空元组:()

        c)空字典:{}

        d)空字符串:''

        e)零值:0

        f)对象为none

       除以上情况外均为True

       eg:

{% if not athlete_list or is_no_coach %}    

没有运动员或者没有教练

{
% else %}

既有运动员又有教练

{
% endif %}

    2)for标签

       django不支持退出循环和continue操作

      a)增加列表是否为空的判断

{% for athlete in athlete_list %}    

{

{ athlete.name }}

{
% empty %}

There are no athletes. Only computer programmers.

{
% endfor %}

      b)反向循环

{% for athlete in athlete_list reversed %}...{
% endfor %}

      c)记录循环次数

       forloop.counter:当前执行到第几次,以1开始

       forloop.counter0:当前执行的到的循环索引,以0开始

       forloop.revcounter:剩余的循环次数,以1结束

         forloop.revcounter0:剩余的循环索引,以0结束

       forloop.first:判断是否是第一次循环

       forloop.last:判断是否是最后一次循环

       eg:

{% for link in links %}{
{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}

       可能生成的运行结果:

       

       forloop.parentloop: 在嵌套循环中使用,用于子循环引用上一级循环中的变量

        eg:

{% for country in countries %}    
{
% for city in country.city_list %}
{
% endfor %}
Country #{
{ forloop.parentloop.counter }}
City #{
{ forloop.counter }}
{
{ city }}
{
% endfor %}

    3)ifequal/ifnotequal标签

       用于判断变量是否相等,支持的类型(第二个参数):字符串、整数、小数

      ps:其他的列表类型,字典类型,布尔类型均不支持

      eg:

{% ifequal section 'sitenews' %}    

Site News

{
% else %}

No News Here

{
% endifequal %}

  4、模板中的注释

    单行注释:

{
# This is a comment #}

    多行注释:

{% comment %}This is amulti-line comment.{
% endcomment %}

  5、过滤器

     常用过滤器:

def template_use(request):    person_name='jimfeng'    ship_date=datetime.datetime.now()    item_list=[]    item_list[0:0] = ['aaa']    item_list[0:0] = ['bbb']    item_list[0:0] = ['ccc']    item_list.reverse();    dic = {
'person_name':person_name,'ship_date':ship_date, 'item_list':item_list} return render_to_response('template_use.html', dic)
Filter Test

Filter Test

length过滤器:

-----person_name字符串长度:{
{ person_name|length }}
-----item_list长度:{
{ item_list|length}}

{
# 添加反斜杠到任何反斜杠、单引号或者双引号前面,常用语输出到js代码 #}

转义字符过滤器:

-----特殊字符前加反斜杠,进行转义:{
{ "A\B'CD"|addslashes }}

日期格式过滤器:

-----对日期进行指定格式的输出:{
{ ship_date|date:"F j, Y" }}

单词截取过滤器:

-----截取you are the right person to do these things前3个词:
-----{
{ "you are the right person to do these things"|truncatewords:"3" }}

列表第一个元素转换成大写(过滤器套接):

-----{
{ item_list|first|upper }}

    运行结果:

    

三、使用模板

  1、从磁盘加载文件

    setting.py:指定模板文件路径

import osBASE_DIR = os.path.dirname(os.path.dirname(__file__))TEMPLATE_DIRS = (    os.path.join(BASE_DIR, 'templates'),)

    说明:如果TEMPLATE_DIRS中只包含了一个路径,则后面必须加上“,”,在

    单元素元组中使用逗号的目的,消除与圆括号表达式之间的歧义。

  2、views.py中使用模板

     1) views.py中使用loader从模板文件路径中获取指定的模板文件:

from django.template.loader import get_templatedef template_use(request):    person_name='jimfeng'    ship_date=datetime.datetime.now()    item_list=[]    item_list[0:0] = ['aaa']    item_list[0:0] = ['bbb']    item_list[0:0] = ['ccc']    item_list.reverse();    t = get_template('template_use.html')    html = t.render(template.Context({
'person_name':person_name,'ship_date':ship_date, 'item_list':item_list})) return HttpResponse(html)

    运行结果:

    

     2)更简洁的使用模板的方式

def template_use(request):    person_name='jimfeng'    ship_date=datetime.datetime.now()    item_list=[]    item_list[0:0] = ['aaa']    item_list[0:0] = ['bbb']    item_list[0:0] = ['ccc']    item_list.reverse();    return render_to_response('template_use.html', locals())

    说明:locals()方法,返回一个所有局部变量为元素的字典

    运行结果:

    

   3、关于模板子目录

      当模板根目录下有多个子目录时,可用过以下方式获取模板文件:

return render_to_response('dateapp/current_datetime.html', {
'current_date': now})

   4、模板中include标签包含子模板

     views.py:

def template_use(request):    person_name='jimfeng'    ship_date=datetime.datetime.now()    item_list=[]    item_list[0:0] = ['aaa']    item_list[0:0] = ['bbb']    item_list[0:0] = ['ccc']    item_list.reverse();    return render_to_response('template_use.html', locals())

     inner.html:

这是include标签包含进来的内部模板!!

     template_use.html:   

Filter Test

Filter Test

length过滤器:

-----person_name字符串长度:{
{ person_name|length }}
-----item_list长度:{
{ item_list|length}}

{
% include 'inner.html' %}

    运行结果:

    

  5、模板继承:比include更优雅的策略

     urls.py中新增的部分:

from django.conf.urls import patterns, url, includeurlpatterns = patterns('',                       #...                       (r'^template_inherit/$', 'django_web_app.views.template_inherit'),)

     views.py中新增的部分:

def template_inherit(request):    current_date=datetime.datetime.now()    return render_to_response('child_template_current_time.html', locals())

    base_template.html:

    {% block title %}{% endblock %}{
# block:1 #}

My helpful timestamp site

{
% block content %}{% endblock %} {
# block:2 #} {% block footer %} {
# block:3 #}

Thanks for visiting my site.

{
% endblock %}

    child_template_current_time.html:

{% extends "base_template.html" %}{
% block title %}当前时间{% endblock %}{
# block:1 #}{
% block content %}

填充content块:It is now {

{ current_date }}.

{
# block:2 #}{% endblock %}{
% block footer %}

footer块被覆盖: sssssssssssss

{
# block:3 #}{% endblock %}

    运行结果:

    

 

转载于:https://www.cnblogs.com/edisonfeng/p/3758514.html

你可能感兴趣的文章
android读写assets目录下面的资源文件(文件夹)
查看>>
[CS] 来电处理流程
查看>>
我的友情链接
查看>>
cin.ignore与cin.getline的体验
查看>>
我的友情链接
查看>>
squid FATAL: Received Segment Violation...dying.
查看>>
mem调优
查看>>
内核编译安装学习笔记
查看>>
做好数据备份 对你多重要
查看>>
Maven项目导出工程依赖JAR包
查看>>
dojo.declare,dojo.define,dojo.require解释
查看>>
酷炫的显示主页面
查看>>
CAA如何进行干涉检查?
查看>>
silverlight vs flash
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
可执行JAR读写内外文件
查看>>
Handbook of Constraints Programming——Chapter4 Backtracking Search Algorithms-Preliminaries
查看>>
[转载] 信息系统项目管理师视频教程——14 项目进度管理
查看>>
linux 解压文件
查看>>