📜  Django-模板系统

📅  最后修改于: 2020-10-25 10:00:19             🧑  作者: Mango


Django使分离Python和HTML成为可能, Python进入视图,HTML进入模板。要链接两者,Django依赖于render函数和Django Template语言。

渲染功能

此函数采用三个参数-

  • 请求-初始请求。

  • 模板的路径-这是相对于项目settings.py变量中TEMPLATE_DIRS选项的路径。

  • 参数字典-包含模板中所需的所有变量的字典。可以创建此变量,也可以使用locals()传递视图中声明的所有局部变量。

Django模板语言(DTL)

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

显示变量

变量如下所示:{{variable}}。模板用render函数的第三个参数中的视图发送的变量替换变量。让我们更改hello.html以显示今天的日期-

hello.html

Hello World!!!

Today is {{today}}

然后我们的观点将变为-

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}}。

一些例子

  • {{字符串| truncatewords:80}} -此过滤器将截断字符串,因此您只会看到前80个单词。

  • {{字符串| lower}} -将字符串转换为小写。

  • {{字符串| escape | linebreaks}} -转义字符串内容,然后将换行符转换为标签。

您还可以设置变量的默认值。

标签

标签使您可以执行以下操作:if条件,for循环,模板继承等。

标记是否

就像在Python一样,您可以在模板中使用if,else和elif-

Hello World!!!

Today is {{today}}

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%}

在这个新模板中,根据一天中的日期,模板将呈现一定的值。

标记为

就像’if’一样,我们具有’for’标签,其作用与Python的完全相同。让我们更改问候视图以将列表传输到模板-

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}}显示该列表的模板-

Hello World!!!

Today is {{today}}

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%}

{% for day in days_of_week %} {{day}}

{% endfor %}

我们应该得到类似-

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


         {% block title %}Page Title{% endblock %}
      
      
   
    
   
   
      {% block content %}
         Body content
      {% endblock %}
      
   

hello.html

{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}

Hello World!!!

Today is {{today}}

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%}

{% for day in days_of_week %} {{day}}

{% endfor %} {% endblock %}

在上面的示例中,在调用/ myapp / hello时,我们仍然会获得与以前相同的结果,但是现在我们依靠extends和block来重构代码-

在main_template.html中,我们使用标签块定义块。标题块将包含页面标题,内容块将具有页面主要内容。在home.html中,我们使用扩展继承自main_template.html,然后填充上面的块定义(内容和标题)。

评论标签

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