Django - 模板系统

  • 简述

    Django 使分离 python 和 HTML 成为可能,python 进入视图,HTML 进入模板。为了将两者联系起来,Django 依赖于渲染函数和 Django 模板语言。
  • 渲染函数

    该函数采用三个参数 -
    • Request− 初始请求。
    • The path to the template- 这是与项目 settings.py 变量中的 TEMPLATE_DIRS 选项相关的路径。
    • Dictionary of parameters− 包含模板中所需的所有变量的字典。可以创建此变量,也可以使用 locals() 传递视图中声明的所有局部变量。
  • Django 模板语言 (DTL)

    Django 的模板引擎提供了一种迷你语言来定义应用程序的面向用户的层。

    显示变量

    变量如下所示:{{variable}}。模板在渲染函数的第三个参数中用视图发送的变量替换变量。让我们更改 hello.html 以显示今天的日期 -
    hello.html
    
    <html>
       
       <body>
          Hello World!!!<p>Today is {{today}}</p>
       </body>
       
    </html>
    
    然后我们的视图将变为 -
    
    def hello(request):
       today = datetime.datetime.now().date()
       return render(request, "hello.html", {"today" : today})
    
    访问 URL/myapp/hello 后,我们现在将得到以下输出 -
    
    Hello World!!!
    Today is Sept. 11, 2015
    
    您可能已经注意到,如果变量不是字符串,Django 将使用 __str__ 方法来显示它;并且使用相同的原理,您可以像在 Python 中一样访问对象属性。例如:如果我们想显示日期年份,我的变量将是:{{today.year}}。
  • 过滤器

    它们帮助您在显示时修改变量。过滤器结构如下所示:{{var|filters}}。
    Some examples
    • {{string|truncatewords:80}}− 此过滤器将截断字符串,因此您只会看到前 80 个单词。
    • {{string|lower}}− 将字符串转换为小写。
    • {{string|escape|linebreaks}}− 转义字符串内容,然后将换行符转换为标签。
    您还可以为变量设置默认值。
  • 标签

    标签允许您执行以下操作:if 条件、for 循环、模板继承等。

    if 标签

    就像在 Python 中一样,您可以在模板中使用 if、else 和 elif -
    
    <html>
       <body>
       
          Hello World!!!<p>Today is {{today}}</p>
          We are
          {% if today.day == 1 %}
          
          the first day of month.
          {% elif today.day == 30 %}
          
          the last day of month.
          {% else %}
          
          I don't know.
          {%endif%}
          
       </body>
    </html>
    
    在这个新模板中,根据一天中的日期,模板会呈现一定的值。

    for 标签

    就像'if'一样,我们有'for'标签,它的工作方式与Python中的完全一样。让我们更改我们的 hello 视图以将列表传输到我们的模板 -
    
    def hello(request):
       today = datetime.datetime.now().date()
       
       daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
       return render(request, "hello.html", {"today" : today, "days_of_week" : daysOfWeek})
    
    使用 {{ for }} 显示该列表的模板 -
    
    <html>
       <body>
          
          Hello World!!!<p>Today is {{today}}</p>
          We are
          {% if today.day == 1 %}
          
          the first day of month.
          {% elif today.day == 30 %}
          
          the last day of month.
          {% else %}
          
          I don't know.
          {%endif%}
          
          <p>
             {% for day in days_of_week %}
             {{day}}
          </p>
          
          {% endfor %}
          
       </body>
    </html>
    
    我们应该得到类似的东西 -
    
    Hello World!!!
    Today is Sept. 11, 2015
    We are I don't know.
    Mon
    Tue
    Wed
    Thu
    Fri
    Sat
    Sun
    

    阻止和扩展标签

    没有模板继承,模板系统就不可能完整。这意味着当您设计模板时,您应该有一个带有孔的主模板,子模板将根据他自己的需要填充,就像一个页面可能需要一个特殊的 css 用于选定的选项卡。
    让我们将 hello.html 模板更改为从 main_template.html 继承。
    main_template.html
    
    <html>
       <head>
          
          <title>
             {% block title %}Page Title{% endblock %}
          </title>
          
       </head>
       
       <body>
       
          {% block content %}
             Body content
          {% endblock %}
          
       </body>
    </html>
    
    hello.html
    
    {% extends "main_template.html" %}
    {% block title %}My Hello Page{% endblock %}
    {% block content %}
    Hello World!!!<p>Today is {{today}}</p>
    We are
    {% if today.day == 1 %}
    the first day of month.
    {% elif today.day == 30 %}
    the last day of month.
    {% else %}
    I don't know.
    {%endif%}
    <p>
       {% for day in days_of_week %}
       {{day}}
    </p>
    {% endfor %}
    {% endblock %}
    
    在上面的示例中,在调用 /myapp/hello 时,我们仍然会得到与以前相同的结果,但现在我们依靠扩展和块来重构我们的代码 -
    在 main_template.html 我们使用标签块定义块。标题块将包含页面标题,内容块将包含页面主要内容。在 home.html 中,我们使用 extends 从 main_template.html 继承,然后我们填充上面的块定义(内容和标题)。

    注释标签

    注释标签有助于将注释定义到模板中,而不是 HTML 注释,它们不会出现在 HTML 页面中。它可用于文档或仅注释一行代码。