django模板语言

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

配置静态文件

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

{% load staticfiles %}

然后配置jquery、Bootscript等等





变量

变量的值是来自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 %}

标签

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

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

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

{% csrf_token %}

大部分标签都接受参数

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

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

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

还可以进行循环

{% for book in book_list %}
            
                {{ book.id }}
                {{ book.title }}
                {{ book.price }}
                {{ book.date }}
                {{ book.publish }}
                {{ book.auth }}
            
        {% 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 = "" %(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. 包里面可以创建任意多个任意名字的模块,只是引用的时候引用相应的模块名即可

模板的继承

基类




    
    
    
    {% block title %}{% endblock %}


    {%  block container%}
    {% endblock %}


模板使用

{% extends "base_logre.html" %}

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

注意的几点:

  1. 开头引用基类{% extends "base_logre.html" %}
  2. 然后在类里面补充内容
    {% block title %}
    欢迎登陆CyanScikit科技网站
    {% endblock %}
  3. 一个基类可以创建很多个引用块

你可能感兴趣的:(django模板语言)