django模板语言

一般情况下后台提取到数据时候只会以某种数据类型的方式交给HTML页面,如果所有的都编程单个的变量,会严重影响开发效率,这就要求模板拥有基本的逻辑处理能力,故而诞生了模板语言

配置静态文件

如果模板设计需要静态文件的话,必须要在开头添加一下语句

{% load staticfiles %}

然后配置jquery、Bootscript等等

<link href="{% static 'dist/css/bootstrap.css' %}" rel="stylesheet" type="text/css"/>

<script src="{% static 'dist/js/jquery-3.2.1.js' %}"></script>
<script src="{% static 'dist/js/bootstrap.js' %}"></script>

变量

变量的值是来自contex中的输出, t,context对象需要在视图函数中指定,这类似于字典对象的keys到values的映射关系。

context应该这样在views里面定义

def index(request):
    book_list = Books.objects.all()

    return render(request, 'index1.html', locals())

这样 book_list就可以直接在模板中使用

变量是被 {{和 }}括起来的部分,例如:

My first name is {{ first_name }}. My last name is {{ last_name }}.

如果使用一个 context包含 {'first_name': 'John', 'last_name': 'Doe'}, 这个模板渲染后的情况将是:

My first name is John. My last name is Doe.

深度查询

字典查询,属性查询和列表索引查找都是通过一个点符号来实现:

{{ my_dict.key }}
{{ my_object.attribute }}
{{ my_list.0 }}

如果一个变量被解析为一个可调用的,模板系统会调用它不带任何参数,并使用调用它的结果来代替这个可调用对象本身。

过滤器

过滤器会更改变量或标签参数的值。

看上去像这样:

{{ django|title }}

例如在 {'django': 'the web framework for perfectionists with deadlines'}这个context中,django变量的值都是小写,经title过滤器渲染后则变成:

The Web Framework For Perfectionists With Deadlines

有些过滤器看起来更像参数:

{{ my_date|date:"Y-m-d" }}

还有很多过滤器

add 把add后的参数加给value

{{ first|add:second }}

first是 [1, 2, 3],second是 [4, 5, 6], 将会输出 [1, 2, 3, 4, 5, 6].

addslashes :在引号前面加上斜杠

{{ value|addslashes }}

如果value是 "I'm using Django", 输出将变成 "I'm using Django".

capfirst:大写变量的第一个字母

{{ value|capfirst }}

如果 value 是 "django", 输出将变成 "Django".

center:使value在给定的宽度范围内居中

"{{ value|center:"15" }}"

如果value是"Django",输出将是“ Django t7>。

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

{{ value|cut:" " }}

如果value为“String with spaces”,输出将为"Stringwithspaces"。

还有safe, default, truncateword等等

自定义过滤器

自定义过滤器其实和自定义标签是很相似的,其目的都是为了使显示达到自己想要的内容或者格式

创建 assets.py,和二中tag在同一目录下,其作用是在全局变量的变动下加载不同的css

首先在settings.py文件中 设置一个变量 IS_DEVELOP=True,作用是当问true时加载测试的css,False时加载正常用的css

asserts.py:

from django import template
from my_blog.settings import IS_DEVELOP
register = template.Library()

@register.filter
def assets(value):
    if IS_DEVELOP:
        return "/static/css/test.css"
    return "/static/css/base_css/base_logre.css"

在base.html中做如下修改

{% load assets %}
<link type="text/css" rel="stylesheet" href="{{ '/static/css/base_css/base_logre.css | assets' }}" />

标签

标签在渲染的过程中提供任意的逻辑。

这个定义是刻意模糊的。例如,一个标签可以输出内容,作为控制结构,例如“if”语句或“for”循环从数据库中提取内容,甚至可以访问其他的模板标签。

Tags是由{%和 %} 来定义的,例如:

{% csrf_token %}

大部分标签都接受参数

{%< cycle 'odd' 'even' %}

部分标签要求使用起始和闭合标签:

{%< if user.is_authenticated %}Hello, {{ user.username }}.{%< endif %}

还可以进行循环

{% for book in book_list %}
            <tr>
                <td>{{ book.id }}</td>
                <td>{{ book.title }}</td>
                <td>{{ book.price }}</td>
                <td>{{ book.date }}</td>
                <td>{{ book.publish }}</td>
                <td>{{ book.auth }}</td>
            </tr>
        {% endfor %}

还能进行很多{% if %}等等

自定义标签

首先在你要加载这个tag的app中新建一个名为templatetags的Python Package,在这个包里面创建一个模块,模块里面就是自定义的标签,引入的时候直接引入这个模块的名字即可 { % load 模块名 % }

编写

比如模块文件名为my_tag.py

from django import template
from django.utils.safestring import mark_safe

register = template.Library() #register的名字是固定的,不可改变


@register.simple_tag
def simple_tag_multi(v1,v2):
return v1 * v2

@register.simple_tag
def my_input(id,arg):
result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
return mark_safe(result)

在模板中导入的时候

{% load mytags %}

{% simple_tag_multi 2 5 %} 参数不限,但不能放在if for语句中
{% simple_tag_multi num 5 %}

注意:

  1. 为了让 {{ load }} 标签工作,包含自定义标签的应用必须在INSTALLED_APPS中。
  2. app下创建的包必须为templatetags
  3. 包里面可以创建任意多个任意名字的模块,只是引用的时候引用相应的模块名即可

模板的继承

基类

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="description " content="Thinkgamer 博客" />
    <meta name="keywords" content="Thinkgamer 博客" />
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    {%  block container%}
    {% endblock %}
</body>
</html>

模板使用

{% extends "base_logre.html" %}

{% block title %}
欢迎登陆CyanScikit科技网站
{% endblock %}
{% block container %}
<div>
  ...新的内容
</div>
{% endblock %}

注意的几点:

  1. 开头引用基类{% extends "base_logre.html" %}
  2. 然后在类里面补充内容
    {% block title %}
    欢迎登陆CyanScikit科技网站
    {% endblock %}
  3. 一个基类可以创建很多个引用块
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容