AI智能
改变未来

Django | 四、模板

文章目录

  • 模板文件
  • 创建模板文件
  • 模板配置
  • 模板文件使用
  • 模板语法
    • 变量的使用
    • 过滤器
    • 模板标签
    • `if` 标签
    • `for` 标签
    • `include` 标签
    • `csrf_token` 标签
  • 自定义标签和过滤器
  • 静态文件
  • 模板的继承
  • 模板文件

    上文中将数据和视图混在一起,这是不符合 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 templateregister = 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.filterdef my_filter(v1, v2):return v1 * v2

    5、利用装饰器

    @register.simple_tag

    自定义标签。

    @register.simple_tagdef 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_tagdef 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,输出结果如下:

    赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » Django | 四、模板