Django之模板

Posted clbao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django之模板相关的知识,希望对你有一定的参考价值。

Django模板

一、变量(只需要记住两种特殊符号)

{{  }} 和{% %}

{{ }}表示变量,在模板渲染的时候替换成值,变量名由字母数字和下划线组成。

{% %}表示逻辑相关的操作。

点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值

例子

views中

def index(request):
    title = 模板语言练习
    lit = [0, 1, 2, 3, 4, 5]
    dic = {name: 小明, age: 18}

    class Preson(object):
        def __init__(self,name,age,hobby):
            self.name = name
            self.age = age
            self.hobby = hobby

        def dream(self):
            return 我能反杀

    p1 = Preson(卢本伟,88,游戏)

    return render(request, index.html, {title: title, lit: lit, dic: dic,p1:p1})

模板中写入

 

<h1>{{ title }}</h1>

<h5>my name is {{ dic.name }},我今年{{ dic.age }}  |我要去{{ lit.3 }}个地方玩耍去</h5>


<h5>我叫做{{ p1.name }},我今年{{ p1.age }}我的爱好是{{ p1.hobby }} 我经常有一个感觉那就是{{ p1.dream }}</h5>
</body>

输出结果是

技术分享图片

注:当模板系统遇到一个(.)时,会按照如下的顺序去查询:

  1. 在字典中查询
  2. 属性或者方法
  3. 数字索引

二、Filters

翻译为过滤器,用来修改变量的显示结果。

语法: {{ value|filter_name:参数 }}

‘|‘左右没有空格没有空格没有空格

 

default  

{{ value|default:"nothing"}}

如果value值没传的话就显示nothing

注:TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid:‘找不到‘,可以替代default的的作用。

settings.py文件设置

TEMPLATES = [
    {
        BACKEND: django.template.backends.django.DjangoTemplates,
        DIRS: [os.path.join(BASE_DIR, templates)]
        ,
        APP_DIRS: True,
        OPTIONS: {
            context_processors: [
                django.template.context_processors.debug,
                django.template.context_processors.request,
                django.contrib.auth.context_processors.auth,
                django.contrib.messages.context_processors.messages,
            ],
             ‘string_if_invalid‘: ‘找不到‘,   #这里设置后会替代default设置的nothing
        },
    },
]

 

 

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"}}

settings文件中修改并加入 

LANGUAGE_CODE = ‘en-us‘

TIME_ZONE = ‘UTC‘

USE_I18N = True

USE_L10N = False #改成False

USE_TZ = True

DATETIME_FORMAT = ‘Y-m-d H:i:s‘ #年月日时分秒 会变成 2018-10-8 12:10:10 这种格式
DATE_FORMAT = ‘Y-m-d‘        # 年月日   会变成 2018-10-8      这种格式

 

 

safe

Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。

比如:

value = "<a href=‘#‘>点我</a>"

{{ value|safe}}

 

 二、自定义的  filter

自定义过滤器只是带有一个或两个参数的Python函数:

  • 变量(输入)的值 - -不一定是一个字符串
  • 参数的值 - 这可以有一个默认值,或完全省略

在过滤器{{var | foo:“bar”}}中,过滤器foo将传递变量var和参数“bar”

自定义filter代码文件放置位置

  技术分享图片

编写自定义filter

 

from django import template

register = template.Library()  # 固定写法,生成一个注册实例对象


@register.filter()  # 告诉Django的模板语言我现在注册一个自定义的filter
def add_sb(value):
    """
    给任意指定的变量添加sb
    :param value: |左边被修饰的那个变量
    :return: 修饰后的变量内容
    """
    return value + sb


@register.filter()
def add_str(value, arg):
    return value + arg

对应的HTML模板

{% load myfilter %}



<p>{{ p1.name|add_sb}}</p>
<p>{{ p1.name|add_str:‘zhen shi da s b‘}}</p>

  

 

三 、 Tags

 for

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}
</ul>

for循环可用一些参数

VariableDescription
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语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

 

with定义一个中间变量

{% with p1.name as name  %}

    <p>{{ name }}</p>

{% endwith %}

四  、csrf_token

这个标签用于跨站请求伪造保护。

在页面的form表单里面写上{% csrf_token %}

(之前settings文件中的注释的可以解封了)

五 、注意事项

1. Django的模板语言不支持连续判断,即不支持以下写法:

{% if a > b > c %}
...
{% endif %}

2. Django的模板语言中属性的优先级大于方法

 

以上是关于Django之模板的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 片段在 Django 模板中不起作用

如何在扩展另一个文件的 django 模板中使用带有动态内容的 html 块片段?

Django之模板层

Django框架之模板层template的一些介绍和使用

Django的templates(模板)

django之设置中间件模板