首页 > 其他分享 >django模板

django模板

时间:2022-11-08 19:26:35浏览次数:53  
标签:变量 标签 html django base 模板 block

一、简介

Django 模板是使用 Django 模板语言标记的文本文档或 Python 字符串。模板引擎可以识别和解释一些结构。主要的是变量和标签。

使用上下文呈现模板。渲染用它们的值替换变量,这些值在上下文中查找,并执行标签。其他一切都按原样输出。

{{  }}和 {% %}

二、变量

 当模板引擎遇到变量时,它会评估该变量并将其替换为结果。变量名称由字母数字字符和下划线 ( ) 的任意组合组成,但不能以下划线开头,也不能是数字

语法

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

三、过滤器

修改要显示的变量

常用模板过滤器

1、default

如果变量为假或空,则使用给定的默认值。否则,使用变量的值

{{ value|default:"nothing" }}

2、length

返回值的长度。这适用于字符串和列表

{{ value|length }}

3、filesizeformat

将值格式化为“人类可读”文件大小(即、 、等)

{{ value|filesizeformat }}

四、标签

标签看起来像是这样的: {% tag %}。标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到的额外信息到模版中。一些标签需要开始和结束标签 (例如{% tag %} ...标签 内容 ... {% endtag %})。

for标签

循环遍历数组中的每个项目

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>
if, elif, 和e

ifelif, 和else

评估一个变量,如果该变量为“真”,则显示块的内容

{% if athlete_list %}
    Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
    Athletes should be out of the locker room soon!
{% else %}
    No athletes.
{% endif %}

五、模板继承

Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。

  通过从下面这个例子开始,可以容易的理解模版继承:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{%/span> endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

这个模板,我们称之为base.html,定义了一个 HTML 框架文档,您可以将它用于两列页面。用内容填充空块是“子”模板的工作。

在这个例子中,block标签定义了三个子模板可以填写的块。block标签所做的只是告诉模板引擎一个子模板可以覆盖模板的那些部分。

子模板可能如下所示:

{% extends "base.html" %}

{% block title %}My amazing blog{% endblock %}

{% block content %}
{% for entry in blog_entries %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}

extends标签是这里的关键。它告诉模板引擎这个模板“扩展”了另一个模板。当模板系统评估这个模板时,它首先定位父模板——在本例中为“base.html”。

此时,模板引擎会注意到其中的三个block标签,base.html并将这些块替换为子模板的内容。根据 的值blog_entries,输出可能如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css">
    <title>My amazing blog</title>
</head>

<body>
    <div id="sidebar">
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
    </div>

    <div id="content">
        <h2>Entry one</h2>
        <p>This is my first entry.</p>

        <h2>Entry two</h2>
        <p>This is my second entry.</p>
    </div>
</body>
</html>

请注意,由于子模板没有定义sidebar块,因此使用来自父模板的值。父模板中标签内的内容 始终用作后备。{% block %}

您可以根据需要使用尽可能多的继承级别。使用继承的一种常见方法是以下三级方法:

  • 创建一个base.html包含网站主要外观的模板。
  • 为您网站的每个“部分”创建一个base_SECTIONNAME.html模板。例如,base_news.htmlbase_sports.html。这些模板都扩展base.html并包括特定于部分的样式/设计。
  • 为每种类型的页面创建单独的模板,例如新闻文章或博客条目。这些模板扩展了相应的部分模板。

这种方法最大限度地提高了代码重用并有助于将项目添加到共享内容区域,例如部分范围的导航。

以下是使用继承的一些技巧:

  • 如果在模板中使用,它必须是该模板中的第一个模板标签。否则,模板继承将不起作用。{% extends %}

  • 基本模板中的标签越多越好。请记住,子模板不必定义所有父块,因此您可以在多个块中填写合理的默认值,然后只定义您以后需要的那些。有更多的钩子比有更少的钩子更好。{% block %}

  • 如果您发现自己在多个模板中复制了内容,这可能意味着您应该将该内容移至父模板中的 a。{% block %}

  • 如果您需要从父模板中获取块的内容,该变量就可以解决问题。如果您想添加到父块的内容而不是完全覆盖它,这很有用。插入的数据不会被自动转义(参见下一节),因为如果需要,它已经在父模板中转义了。{{ block.super }}{{ block.super }}

  • 通过使用与您继承相同的模板名称, 可用于在覆盖模板的同时继承模板。结合,这可能是进行小型自定义的强大方法。有关完整示例,请参阅 覆盖模板操作方法中的扩展覆盖模板{% extends %}{{ block.super }}

  • 使用模板标记语法在 a 之外创建的变量不能在块内使用。例如,这个模板不渲染任何东西:{% block %}

{% translate "Title" as title %}
{% block content %}{{ title }}{% endblock %}

注意:

不能block在同一个模板中定义多个具有相同名称的标签。存在此限制是因为块标签在“两个”方向上工作。也就是说,块标签不仅提供了一个要填充的洞——它还定义了填充parent中的洞的内容。如果模板中有两个名称相似的block标签,则该模板的父级将不知道要使用哪个块的内容。

 

标签:变量,标签,html,django,base,模板,block
From: https://www.cnblogs.com/songyunjie/p/16870857.html

相关文章

  • django视图
    一、简介视图是Django应用程序中的一种网页“类型”,通常提供特定功能并具有特定模板,在Django中,网页和其他内容是通过视图传递的。每个视图都由一个Python函数(或方法......
  • dij模板[自用]
    今天在学计划书,发现自己以前编的板子丑丑长长的,改得舒服一点当作新的板子唔..#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e6;intcnt=0,n,m,s,dis[......
  • python测试开发django-198.bootstrap-formvalidation校验成功发ajax请求
    前言form表单提交按钮是type="submit"类型,输入框按回车会自动提交表单。如果我们想自定义提交表单,可以使用ajax提交。Form表单一个登录页面的Form表单<fo......
  • Django限制用户上传文件格式与大小
    https://blog.csdn.net/weixin_42134789/article/details/100012339Django模型中自带的ImageField和FileField字段并不会也不能限制用户上传的图片或文件的格式和大小,这给......
  • P3834 【模板】可持久化线段树 2
    先用结构体实现了下,发现写错了(只有20分),后面直接用的数组了  #include<bits/stdc++.h>usingnamespacestd;constintN=2e5+7;inttl[N<<6],tr[N<<6],sum......
  • django的auth模块学习
    auth1.我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情......
  • django图片显示问题
        第二种是可以的......
  • P5367 【模板】康托展开
    题意求\(1\simN\)的一个给定全排列在所有\(1\simN\)全排列中的排名。结果对\(998244353\)取模。分析模板,又学习了一种新的东西,但好像除了做这道体外,还不知道有......
  • JAVA 模板设计模式
    今天来介绍下一个我觉得蛮不错的设计模式(比较容易应用于业务场景),它就是---模板设计模式。OK,我们直接看代码:模板模式,那当然我们需要建一个模板先,建一个抽象类,VehicleControlM......
  • LG P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT)
    \[C_k=\sum_{i|j=k}A_iB_j\]这样的或卷积可以做一次\(\text{FWT}\),把数组变为\(a_i=\sum_{j\subseteqi}A_i\),也就是子集和的形式,然后就可以对应位相乘了变回去的......