您的位置:首页 > 编程语言 > Go语言

Django | 四、模板

2020-08-28 19:14 831 查看

文章目录

  • 模板语法
  • 自定义标签和过滤器
  • 静态文件
  • 模板的继承
  • 模板文件

    上文中将数据和视图混在一起,这是不符合 Django 的理念的

    创建模板文件

    在 Django 中,模板被放在

    templates
    文件夹下,我们手动创建这个文件夹

    并在其中创建一个文件

    index.html
    ,写入

    <h1>{{ hello }}</h1>

    模板配置

    同时也要在

    setting.py
    种配置。在字典
    TEMPALTES
    DIRS
    元素中写入值
    BASE_DIR + '/templates'
    完成对于模板的配置

    Django 会优先在配置的目录下寻找模板。如果无法找到模板,Dajngo 会去各应用的

    templates
    文件夹下寻找

    模板文件使用

    要在

    view.py
    中使用模板,需要导入
    render()
    函数

    from django.shortcuts import render

    事实上,

    render()
    函数的结构如下

    def render(request,template_path,context={}):
    # 1.加载模板文件,获取一个模板对象
    temp = loader.get_template(template_path)
    # 2.定义模板上下文,给模板传递数据
    context = RequestContext(request, context)
    # 3.模板渲染,产生一个替换后的html内容
    res_html = temp.render(context)
    # 4.返回应答
    return HttpResponse(res_html)

    我们在

    MyApp\view.py
    中写入

    def hello(request):
    context = {}
    context['hello'] = 'Hello World'
    return render(request, 'index.html', context)

    则网页

    https:\\localhost:8000\MyApp\
    就会有相应的显示

    模板语法

    变量的使用

    在模板中,我们用

    {{}}
    来使用变量。而在视图的
    render()
    函数中,
    context
    参数用于传递变量的数据。
    context
    是一个字典,其元素的键是模板中的变量名,元素的值是模板中变量的值

    过滤器

    在变量后使用管道符号

    |
    可以在被显示前用过滤器操作变量的值,其格式为

    {{ variable|filter:filter_parameters }}

    并且过滤器可以顺序链接使用

    具体有哪些过滤器可以查看官方过滤器文档

    常用的过滤器有

    lower, upper, truncatewords, addslaches, date, length, default, filesizeformat, safe

    模板标签

    if
    标签

    其主要结构为

    {% if condition1 %}
    {% elif condition2 %}
    {% else %}
    {% endif %}

    for
    标签

    for
    循环的主要结构为

    {% for athlete in athlete_list %}
    {% empty %}
    {% endfor %}

    {% for %}
    标签里可以通过
    {{forloop}}
    变量获取循环序号。

    • forloop.counter
      : 顺序获取循环序号,从 1 开始计算
    • forloop.counter0
      : 顺序获取循环序号,从 0 开始计算
    • forloop.revcounter
      : 倒叙获取循环序号,结尾序号为 1
    • forloop.revcounter0
      : 倒叙获取循环序号,结尾序号为 0
    • forloop.first
      (一般配合if标签使用): 第一条数据返回 True,其他数据返回 False
    • forloop.last
      (一般配合if标签使用): 最后一条数据返回 True,其他数据返回 False

    include
    标签

    {% include %}
    标签允许在模板中包含其它的模板的内容。

    {% include "nav.html" %}

    csrf_token
    标签

    csrf_token
    用于form表单中,作用是跨站请求伪造保护。

    如果不用

    {% csrf_token %}
    标签,在用 form 表单时,要再次跳转页面会报403权限错误。

    用了

    {% csrf_token %}
    标签,在 form 表单提交数据时,才会成功。

    解析:

    首先,向浏览器发送请求,获取登录页面,此时中间件 csrf 会自动生成一个隐藏input标签,该标签里的 value 属性的值是一个随机的字符串,用户获取到登录页面的同时也获取到了这个隐藏的input标签。

    然后,等用户需要用到form表单提交数据的时候,会携带这个 input 标签一起提交给中间件 csrf,原因是 form 表单提交数据时,会包括所有的 input 标签,中间件 csrf 接收到数据时,会判断,这个随机字符串是不是第一次它发给用户的那个,如果是,则数据提交成功,如果不是,则返回403权限错误。

    自定义标签和过滤器

    在根目录下创建

    templatetags
    目录,并在
    templatetags
    目录下创建任意
    .py
    文件,例如
    my_tags.py
    ,其代码如下

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

    修改

    settings.py
    文件的
    TEMPLATES
    选项配置,添加
    libraries
    配置:

    TEMPLATES = [
    {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [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',
    ],
    "libraries":{                          # 添加这边三行配置
    'my_tags':'templatetags.my_tags'   # 添加这边三行配置
    }                                      # 添加这边三行配置
    },
    },
    ]

    利用装饰器

    @register.filter
    自定义过滤器。

    注意:装饰器的参数最多只能有 2 个。

    @register.filter
    def my_filter(v1, v2):
    return v1 * v2

    5、利用装饰器

    @register.simple_tag
    自定义标签。

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

    6、在使用自定义标签和过滤器前,要在 html 文件 body 的最上方中导入该 py 文件。

    {% load my_tags %}

    7、在 HTML 中使用自定义过滤器。

    {{ 11|my_filter:22 }}

    8、在 HTML 中使用自定义标签。

    {% my_tag1 11 22 33 %}

    9、语义化标签

    在该 py 文件中导入

    mark_safe

    from django.utils.safestring import mark_safe

    定义标签时,用上 mark_safe 方法,令标签语义化,相当于 jQuery 中的 html() 方法。

    和前端HTML文件中的过滤器 safe 效果一样。

    @register.simple_tag
    def my_html(v1, v2):
    temp_html = "<input type='text' id='%s' class='%s' />" %(v1, v2)
    return mark_safe(temp_html)

    在HTML中使用该自定义标签,在页面中动态创建标签。

    {% my_html "zzz" "xxx" %}

    静态文件

    在根目录下创建

    static
    文件夹用于存储静态文件(如css样式文件,js执行文件以及一些图片、声音、视频等)

    在项目创建时就会自动完成

    static
    的配置,此处无需再配置

    模板的继承

    模板继承
    模板可以用继承的方式来实现复用,减少冗余内容。

    网页的头部和尾部内容一般都是一致的,我们就可以通过模板继承来实现复用。

    父模板用于放置可重复利用的内容,子模板继承父模板的内容,并放置自己的内容。

    父模板
    标签 block…endblock: 父模板中的预留区域,该区域留给子模板填充差异性的内容,不同预留区域名字不能相同。

    {% block 名称 %}
    预留给子模板的区域,可以设置设置默认内容
    {% endblock 名称 %}
    子模板
    子模板使用标签 extends 继承父模板:

    {% extends “父模板路径”%}
    子模板如果没有设置父模板预留区域的内容,则使用在父模板设置的默认内容,当然也可以都不设置,就为空。

    子模板设置父模板预留区域的内容:

    { % block 名称 % }
    内容
    {% endblock 名称 %}
    接下来我们先创建之前项目的 templates 目录中添加 base.html 文件,代码如下:

    HelloWorld/templates/base.html 文件代码:

    菜鸟教程(runoob.com)

    Hello World!

    菜鸟教程 Django 测试。

    {% block mainbody %}

    original

    {% endblock %} 以上代码中,名为 mainbody 的 block 标签是可以被继承者们替换掉的部分。

    所有的 {% block %} 标签告诉模板引擎,子模板可以重载这些部分。

    runoob.html 中继承 base.html,并替换特定 block,runoob.html 修改后的代码如下:

    HelloWorld/templates/runoob.html 文件代码:
    {%extends “base.html” %}

    {% block mainbody %}

    继承了 base.html 文件

    {% endblock %} 第一行代码说明 runoob.html 继承了 base.html 文件。可以看到,这里相同名字的 block 标签用以替换 base.html 的相应 block。

    重新访问地址 http://127.0.0.1:8000/runoob,输出结果如下:

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: