博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django 模版语言详解
阅读量:6312 次
发布时间:2019-06-22

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

一.简介

模版是纯文本文件。它可以产生任何基于文本的的格式(HTML,XML,CSV等等)。

模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签

例:

{% extends "base_generic.html" %}{% block title %}{
{ section.title }}{% endblock %}{% block content %}

{
{ section.title }}

{% for story in story_list %}

{
{ story.headline|upper }}

{

{ story.tease|truncatewords:"100" }}

{% endfor %}{% endblock %}

二.使用

1.变量

格式:

{
{ variable }}

变量命名规则

1.变量的命名包括任何字母数字以及下划线 ("_")的组合

2.不能在变量名称中使用空格和标点符号

当模版系统遇到点("."),它将以这样的顺序查询:

  • 字典查询(Dictionary lookup)
  • 属性或方法查询(Attribute or method lookup)
  • 数字索引查询(Numeric index lookup)

例;

 
{#如果后台 渲染传过来的是字典格式的数据 那么前端页面解析值 dict={"k1":"v1"} 假设传的是{"dict": dict} 前端页面取值 .字典key值#}

{
{dict.k1}}

2.过滤器

  可以通过使用 过滤器来改变变量的显示

格式:

{
{ name|lower }}

管道符过滤,过滤器能够被“串联”。一个过滤器的输出将被应用到下一个

过滤器参数;

{
{ item.content |truncatewords:30 }}

default

{
{ value|default:"nothing" }}

length

返回值的长度。它对字符串和列表都起作用

{
{ value|length }}

filesizeformat

将该数值格式化为一个 “人类可读的” 文件容量大小 (例如 '13 KB''4.1 MB''102 bytes', 等等)

{
{ value|filesizeformat }}

add

把add后的参数加给value

{
{ value|add:"2" }}

capfirst

将变量首字母变大写

{
{ value|capfirst }}

cut

移除value中所有的与给出的变量相同的字符串

{
{ value|cut:" " }}

dictsort

根据指定的key值对列表字典排序,并返回

{
{ value|dictsort:"name" }}

如,给定的值是:

[    {
'name': 'peter', 'age': 19}, {
'name': 'amy', 'age': 22}, {
'name': 'jim', 'age': 31},]

那么结果将是;

[    {
'name': 'amy', 'age': 22}, {
'name': 'jim', 'age': 31}, {
'name': 'peter', 'age': 19},]

也可以处理较为复杂的;

{% for book in books|dictsort:"author.age" %}    * {
{ book.title }} ({
{ book.author.name }}){% endfor %}

如给定值为:

[    {
'title': '1984', 'author': {
'name': 'George', 'age': 45}}, {
'title': 'Timequake', 'author': {
'name': 'Kurt', 'age': 75}}, {
'title': 'Alice', 'author': {
'name': 'Lewis', 'age': 33}},]

那么结果为:

* Alice (Lewis)* 1984 (George)* Timequake (Kurt)

random

随机返回一个值

{
{ value|random }}

如果 value 是 列表 ['a', 'b', 'c', 'd'], 可能输出的是 "b"

slice

切片

{
{ some_list|slice:":2" }}

如果 some_list 是 ['a', 'b', 'c'], 输出结果为 ['a', 'b']

truncatewords

字符串截断

{
{ value|truncatewords:2 }}

如果 value 是 "Joel is slug",输出  "Joel is ...".

3.标签

格式

{% tag %}

简介

标签比变量复杂得多:有些用于在输出中创建文本,有些用于控制循环或逻辑,有些用于加载外部信息到模板中供以后的变量使用。

有些标签需要开始标签和结束标签(例如{% tag %} ... tag contents ... {% endtag %}

常用标签;

for标签

格式

{% for athlete in athlete_list %}    
  • {
    { athlete.name }}
  • {
    % endfor %}

    if,elif and else

    计算一个变量,并且当变量是“true”时,显示块中的内容

    格式:

    {% if athlete_list %}    Number of athletes: {
    { athlete_list|length }}{
    % elif athlete_in_locker_room_list %} Athletes should be out of the locker room soon!{
    % else %} No athletes.{
    % endif %}

    4.注释

      要注释模版中一行的部分内容,使用注释语法 {# #}

    三.模版继承

    模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。

    例;

        
    {% block title %}My amazing site{%/span> endblock %}
    {% block content %}{% endblock %}

    这个模版,我们把它叫作 base.html, 它定义了一个可以用于两列排版页面的简单HTML骨架。“子模版”的工作是用它们的内容填充空的blocks

    子模版可能看起来是这样的:

    {% extends "base.html" %}/span>{% block title %}My amazing blog{% endblock %}{% block content %}{% for entry in blog_entries %}    

    {
    { entry.title }}

    {

    { entry.body }}

    {% endfor %}{% endblock %}

    extends 标签是这里的关键。它告诉模版引擎,这个模版“继承”了另一个模版。当模版系统处理这个模版时,首先,它将定位父模版——在此例中,就是“base.html”。

    模版引擎将注意到 base.html 中的三个 block 标签,并用子模版中的内容来替换这些block。根据 blog_entries 的值,输出可能看起来是这样的:

        
    My amazing blog

    Entry one

    This is my first entry.

    Entry two

    This is my second entry.

    使用继承的一个常用方式是类似下面的三级结构:

    • 创建一个 base.html 模版来控制您整个站点的主要视觉和体验。
    • 为您的站点的每一个“分支”创建一个base_SECTIONNAME.html 模版。例如, base_news.htmlbase_sports.html这些模版都继承自 base.html ,并且包含了每部分特有的样式和设计。
    • 为每一种页面类型创建独立的模版,例如新闻内容或者博客文章。这些模版继承对应分支的模版

    母版结构

    {% block content %}...{% endblock content %}

    四.自动HTML转义

    默认情况下,Django 中的每个模板会自动转义每个变量的输出。明确地说,下面五个字符被转义:

    • < 会转换为&lt;
    • > 会转换为&gt;
    • ' (单引号) 会转换为&#39;
    • " (双引号)会转换为 &quot;
    • & 会转换为 &amp;

    如何关闭

    4.1 用于模板代码块

    要控制模板上的自动转义,将模板(或者模板中的特定区域)包裹在autoescape标签 中

    {% autoescape off %}    Hello {
    { name }}{% endautoescape %}

    autoescape标签接受on 或者 off作为它的参数。有时你可能想在自动转义关闭的情况下强制使用它。下面是一个模板的示例:

    Auto-escaping is on by default. Hello {
    { name }}{% autoescape off %} This will not be auto-escaped: {
    { data }}. Nor this: {
    { other_data }} {% autoescape on %} Auto-escaping applies again: {
    { name }} {% endautoescape %}{% endautoescape %}

    自动转义标签作用于扩展了当前模板的模板,以及通过 include 标签包含的模板,就像所有block标签那样。例如:

    {% autoescape off %}

    {% block title %}{% endblock %}

    {% block content %}{% endblock %}{% endautoescape %}
    base.html
    {% extends "base.html" %}{% block title %}This & that{% endblock %}{% block content %}{
    { greeting }}{% endblock %}
    child.html

    五.自定义simple_tag

    自定义simple_tag

    {% load humanize %}{
    { 45000|intcomma }}

    上面的例子中, load标签加载了humanize标签库,之后我们可以使用intcomma过滤器。如果你开启了django.contrib.admindocs,你可以查询admin站点中的文档部分,来寻找你的安装中的自定义库列表。

    load标签可以接受多个库名称,由空格分隔。例如

    {% load humanize i18n %}

    5.1 自定义标签代码而已

    自定义模板标签和过滤器必须位于Django 的某个应用中。如果它们与某个已存在的应用相关,那么将其与应用绑在一起才有意义;否则,就应该创建一个新的应用来包含它。

    这个应用应该包含一个templatetags 目录,和models.pyviews.py等文件处于同一级别目录下,如果目录不存在则创建它——不要忘记创建__init__.py 文件以使得该目录可以作为Python 的包。在添加这个模块以后,在模板里使用标签或过滤器之前你将需要重启服务器。新建 PY文件

    切记:目录名一定要是templatetags

    如:

    #!/usr/bin/env python#coding:utf-8from django import templatefrom django.utils.safestring import mark_safefrom django.template.base import resolve_variable, Node, TemplateSyntaxError  register = template.Library()  @register.simple_tagdef my_simple_time(v1,v2,v3):    return  v1 + v2 + v3  @register.simple_tagdef my_input(id,arg):    result = "" %(id,arg,)    return mark_safe(result)

    然后在你的模板中你应当这样使用

    {% load extend_temp %}

    为了成为一个可用的标签库,这个模块必须包含一个名为 register的变量,它是template.Library 的一个实例,所有的标签和过滤器都是在其中注册的。所以把如下的内容放在你的模块的顶部:

    from django import templateregister = template.Library()

    5.2 编写自定义模板过滤器

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

    • (输入的)变量的值 —— 不一定是字符串形式。
    • 参数的值 —— 可以有一个初始值,或者完全不要这个参数。

    例如,在{

    var|foo:"bar" }}中,foo过滤器应当传入变量var和参数 "bar"

    由于模板语言没有提供异常处理,任何从过滤器中抛出的异常都将会显示为服务器错误。因此,如果有合理的值可以返回,过滤器应该避免抛出异常。在模板中有一个明显错误的情况下,引发一个异常可能仍然要好于用静默的失败来掩盖错误

    例 ;

    def cut(value, arg):    """Removes all values of arg from the given string"""    return value.replace(arg, '')

    下面是这个过滤器应该如何使用

    {
    { somevariable|cut:"0" }}

    大多数过滤器没有参数。在这种情况下,你的函数不带这个参数即可。示例︰

    def lower(value): # 只能是一个参数.    """变小写"""    return value.lower()

    5.3 注册自定义过滤器

    django.template.Library.filter()

    一旦你写好了你的自定义过滤器函数,你就开始需要把它注册为你的 Library实例,来让它在Django模板语言中可用

    register.filter('cut', cut)register.filter('lower', lower)

    Library.filter()方法需要两个参数:

    1. 过滤器的名称(一个字符串对象)
    2. 编译的函数 – 一个Python函数(不要把函数名写成字符串)

    你还可以把register.filter()用作装饰器:

    @register.filter(name='cut')def cut(value, arg):    return value.replace(arg, '')@register.filterdef lower(value):    return value.lower()
    @register.filterdef detail3(value,arg):    """    查看余数是否等于remainder arg="1,2"    :param counter:    :param allcount:    :param remainder:    :return:    """    allcount, remainder = arg.split(',')    allcount = int(allcount)    remainder = int(remainder)    if value%allcount == remainder:        return True    return False

     

    详细参考:http://python.usyiyi.cn/django/howto/custom-template-tags.html

    转载于:https://www.cnblogs.com/jl-bai/p/5843322.html

    你可能感兴趣的文章
    网络编程中常见结构体
    查看>>
    SSL/TLS原理详解
    查看>>
    Docker 自定义SSH服务镜像
    查看>>
    JavaScript强化教程 —— Cocos2d-JS自动JSB绑定规则修改
    查看>>
    buildroot下查找外部编译器通过ext-toolchain-wrapper调用的参数
    查看>>
    在Android studio中添加jar包方法如下
    查看>>
    iframe 在ie下面总是弹出新窗口解决方法
    查看>>
    安装nginx 常见错误及 解决方法
    查看>>
    android编译系统makefile(Android.mk)写法
    查看>>
    MD5源代码C++
    查看>>
    Eclipse 添加 Ibator
    查看>>
    Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
    查看>>
    Python编程语言
    查看>>
    十四、转到 linux
    查看>>
    Got error 241 'Invalid schema
    查看>>
    ReferenceError: event is not defined
    查看>>
    男人要内在美,更要外在美
    查看>>
    为什么要跟别人比?
    查看>>
    app启动白屏
    查看>>
    Oracle 提高查询性能(基础)
    查看>>