二、Django模板语法

一、模板语法简介

模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了把前端代码和服务端代码分离的作用,让项目中的业务逻辑代码和数据表现代码分离,让前端开发者和服务端开发者可以更好的完成协同开发。

静态网页:页面上的数据都是写死的,万年不变

动态网页:页面上的数据是从后端动态获取的(比如后端获取当前时间;后端获取数据库数据然后传递给前端页面)

要在django框架中使用模板引擎把视图中的数据更好的展示给客户端,需要完成3个步骤:

在项目配置文件中指定保存模板文件的模板目录。一般模板目录都是设置在项目根目录或者主应用目录下。

在视图中基于django提供的渲染函数绑定模板文件和需要展示的数据变量

在模板目录下创建对应的模板文件,并根据模板引擎内置的模板语法,填写输出视图传递过来的数据

二、render函数内部本质

二、Django模板语法_第1张图片

  • DTL模板文件与普通html文件的区别在哪里?
DTL模板文件是一种带有特殊语法的HTML文件,这个HTML文件可以被Django编译,可以传递参数进去,实现数据动态化。在编译完成后,生成一个普通的HTML文件,然后发送给客户端
  • 开发中,我们一般把开发中的文件分2种,分别是静态文件和动态文件。
* 静态文件,数据保存在当前文件,不需要经过任何处理就可以展示出去。普通html文件,图片,视频,音频等这一类文件叫静态文件。
* 动态文件,数据并不在当前文件,而是要经过服务端或其他程序进行编译转换才可以展示出去。 编译转换的过程往往就是使用正则或其他技术把文件内部具有特殊格式的变量转换成真实数据。 动态文件,一般数据会保存在第三方存储设备,如数据库中。django的模板文件,就属于动态文件。

三、配置templates

  • 新创建一个Django项目时默认会有一个templates文件(不使用,删除)
  • 在每个app的应用中使用各自的templates目录,配置如下:
    配置全局settings.py文件,添加如下内容:
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],   ##配置templates目录的路径,为当前执行文件的父目录下的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',
            ],
        },
    },
]

删除settings.py文件关于templates的配置,默认会从当前app的templates目录中查找

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],  ##删除此项, 默认会从当前app的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',
            ],
        },
    },
]

二、Django模板语法_第2张图片

四、模板语法

变量

  • 单个字符串
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
    path('admin/', admin.site.urls),
    path('temp/',views.temp)    ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
    data = "tom"    ###添加变量 (单个字符串)
    return render(request,"index.html",{"user": data})    ###把变量传入html文件中

###############################



    
    Title


欢迎{{ user }}登录

####使用变量替换{{ user}}值。

访问界面:
二、Django模板语法_第3张图片

  • 列表
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
    path('admin/', admin.site.urls),
    path('temp/',views.temp)    ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
    data_list = ["tom","lisa","davia"]     ###添加一个列表
    return render(request,"index.html",{"user": data_list})    ###把变量传入html文件中

###############################



    
    Title


欢迎{{ user }}登录

####使用变量替换{{ user}}值。

你好,我是{{ user.0}}

###使用列表的第一个值

二、Django模板语法_第4张图片

  • 字典
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
    path('admin/', admin.site.urls),
    path('temp/',views.temp)    ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
    data_dict = {"name":"tom","age":18,"height": 180}    ###添加一个字典
    return render(request,"index.html",{"user": data_dict})    ###把变量传入html文件中

###############################



    
    Title


欢迎{{ user }}登录

####使用变量替换{{ user}}值。

你好,我是{{ user.name}}

###取字典的name 值

二、Django模板语法_第5张图片

过滤器

  • first/last 获取列表第一个/最后一个值
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
    path('admin/', admin.site.urls),
    path('temp/',views.temp)    ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
    data_list = ["tom","lisa","davia"]     ###添加一个列表
    return render(request,"index.html",{"user": data_list})    ###把变量传入html文件中

###############################



    
    Title


欢迎{{ user }}登录

####使用变量替换{{ user}}值。

你好,我是{{ user| first}}

###获取列表的第一个值
  • default没有值的时候,设置为默认值
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
    path('admin/', admin.site.urls),
    path('temp/',views.temp)    ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
    data_dict = {"name":"tom","age":18,"height": 180}    ###添加一个字典
    return render(request,"index.html",{"user": data_dict})    ###把变量传入html文件中

###############################



    
    Title


欢迎{{ user }}登录

####使用变量替换{{ user}}值。

你好,我是{{ user.birth|default="1990-1-1"}}

###取字典的birth 值,没有则为1990-1-1
  • upper/lower进行大小写转换
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
    path('admin/', admin.site.urls),
    path('temp/',views.temp)    ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
    data_dict = {"name":"tom","age":18,"height": 180}    ###添加一个字典
    return render(request,"index.html",{"user": data_dict})    ###把变量传入html文件中

###############################



    
    Title


欢迎{{ user }}登录

####使用变量替换{{ user}}值。

你好,我是{{ user.name|upper}}

###取字典的name的值,替换为大写
  • make_list将内容转换为列表
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
    path('admin/', admin.site.urls),
    path('temp/',views.temp)    ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
    data_dict = {"name":"tom","age":18,"height": 180}    ###添加一个字典
    return render(request,"index.html",{"user": data_dict})    ###把变量传入html文件中

###############################



    
    Title


欢迎{{ user }}登录

####使用变量替换{{ user}}值。

你好,我是{{ user.name|make_list}}

###取字典的name的值,并转换为列表
  • filesizeformat 把文件大小的数值转换成单位表示
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
    path('admin/', admin.site.urls),
    path('temp/',views.temp)    ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
    file_size = 100000000
    return render(request,"index.html",{"file_size": file_size})    ###把变量传入html文件中

###############################



    
    Title


欢迎{{ user }}登录

####使用变量替换{{ user}}值。

你好,文件大小为{{ file_size|filesizeformat }}

###转换为文件格式大小

如下: 会自动转换为对应的单位大小
二、Django模板语法_第6张图片

  • random 随机提取某个成员
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
    path('admin/', admin.site.urls),
    path('temp/',views.temp)    ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
    data_list = ["tom", "lisa", "davia"]
    return render(request,"index.html",{"user_list": data_list})    ###把变量传入html文件中

###############################



    
    Title


欢迎{{ user_list|random }}登录

####随机从list列表随机选择一个

二、Django模板语法_第7张图片

标签

标签在渲染过程中提供了任意逻辑。标签被 {%%} 包围,如下:

{% csrf_token %}
{% if  或者 for %}
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
    path('admin/', admin.site.urls),
    path('temp/',views.temp)    ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
    book_list = [
        {"id": 11, "name": "python基础入门", "price": 130.00},
        {"id": 17, "name": "Go基础入门", "price": 230.00},
        {"id": 23, "name": "PHP基础入门", "price": 330.00},
        {"id": 44, "name": "Java基础入门", "price": 730.00},
        {"id": 51, "name": "C++基础入门", "price": 300.00},
        {"id": 56, "name": "C#基础入门", "price": 100.00},
        {"id": 57, "name": "前端基础入门", "price": 380.00},
    ]
    return render(request,"index.html",{"book_list": book_list})    ###把变量传入html文件中

###############################



    
    Title


欢迎登录

    {% for item in book_list %}
  • {{ item.name }}
  • {% endfor %}

二、Django模板语法_第8张图片

五、模板继承

传统的模板分离技术,依靠{% include “模板文件名”%}实现,这种方式,虽然达到了页面代码复用的效果,但是由此也会带来大量的碎片化模板,导致维护模板的成本上升.因此, Django框架中除了提供这种模板分离技术以外,还并行的提供了 模板继承给开发者.

{% include "模板文件名"%}  # 模板嵌入
{% extends "base.html" %} # 模板继承
  • 继承父模板的公共内容
子模板, templates/index.html
{% extends "base.html" %}

##################################
父模板, templates/base.html



    
    Title


    

base.html的头部

base.html的内容

base.html的脚部

二、Django模板语法_第9张图片

  • 个性展示不同于父模板的内容
如果你在模版中使用 {% extends %} 标签,它必须是模版中的第一个标签。其他的任何情况下,模版继承都将无法工作。
在base模版中设置越多的 {% block %} 标签越好。请记住,子模版不必定义全部父模版中的blocks,所以,你可以在大多数blocks中填充合理的默认内容,然后,只定义你需要的那一个。多一点钩子总比少一点好。
为了更好的可读性,你也可以给你的 {% endblock %} 标签一个 名字 。例如:{``% block content``%``}``...``{``% endblock content``%``},在大型模版中,这个方法帮你清楚的看到哪一个  {% block %} 标签被关闭了。
不能在一个模版中定义多个相同名字的 block 标签。

base.html文件的内容




    
    {% block title %}{% endblock %}  ###根据不同子界面的类型来添加


    

{% block head %}{% endblock %}

index.html文件的内容

{% extends "base.html" %}
{% block title %}index的title{% endblock %}
{% block head %}index 的head{% endblock %}

二、Django模板语法_第10张图片

你可能感兴趣的:(python,开发语言)