Python web实战之 Django 的模板语言详解


关键词:

Python、web开发、Django、模板语言


概要

作为 Python Web 开发的框架之一,Django 提供了一套完整的 MVC 模式,其中的模板语言为开发者提供了强大的渲染和控制前端的能力。本文介绍 Django 的模板语言。

1. Django 模板语言入门

Django 的模板语言是一种基于 HTML 的模板语言,它提供了丰富的标签和过滤器来帮助开发者实现前端渲染和逻辑控制。在使用模板语言之前,我们需要先了解 Django 的模板文件结构和渲染方式。

1.1 模板文件的结构

在 Django 中,模板文件通常存放在应用的 templates 目录下。一个模板文件通常由以下几部分组成:

  • 模板头部:包含模板引用其他文件、定义模板块等信息。

  • 模板主体:包含实际的 HTML 代码和模板标签。

  • 模板尾部:包含 JavaScript 代码、CSS 样式等信息。

通常情况下,我们只需要编写模板主体部分,而头部和尾部可以使用已有的模板文件或者框架提供的默认模板。

1.2 模板的渲染方式

在 Django 中,模板文件可以通过视图函数中的 render 函数进行渲染,例如:

from django.shortcuts import render

def index(request):
    context = {'title': 'Hello World!'}
    return render(request, 'index.html', context)

在 render 函数中,第一个参数是请求对象,第二个参数是模板文件名,第三个参数是传递给模板的上下文变量。在模板中,我们可以通过变量名来访问上下文变量,例如:

<h1>{{ title }}</h1>

在模板渲染时,Django 会将模板中的变量替换为上下文变量的值,并执行模板标签和过滤器。

2. Django 模板语言进阶

除了简单的变量渲染,Django 的模板语言还提供了丰富的标签和过滤器来实现逻辑控制和数据处理。下面我们将介绍一些常用的模板标签和过滤器。

2.1 模板标签

Django 的模板标签可以实现逻辑控制和数据处理,常用的标签包括:

  • if 标签:用于条件判断。

  • for 标签:用于循环迭代。

  • include 标签:用于引入其他模板文件。

  • block 和 extends 标签:用于模板继承和重载。

  • url 标签:用于生成 URL。

例如,我们可以使用 if 标签来判断一个变量是否为空:

{% if variable %}
    <p>{{ variable }}</p>
{% else %}
    <p>Variable is empty.</p>
{% endif %}

使用 for 标签来循环迭代一个列表:

{% for item in list %}
    <li>{{ item }}</li>
{% endfor %}

使用 include 标签引入其他模板文件:

{% include 'header.html' %}

当我们需要在多个页面中使用相同的 HTML 结构时,可以使用 Django 的模板继承和重载功能,减少代码重复和维护成本。

先创建一个基础模板文件 base.html,定义共用的 HTML 结构和 CSS 样式:

<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div id="header">
        {% block header %}{% endblock %}
    </div>
    <div id="content">
        {% block content %}{% endblock %}
    </div>
    <div id="footer">
        {% block footer %}{% endblock %}
    </div>
</body>
</html>

在这个模板中,使用了 block 标签来定义可重载的区域。例如 {% block title %}{% endblock %} 定义了一个名为 title 的区域,该区域可以在子模板中被重载。

接下来创建一个子模板文件 child.html,继承 base.html 并重载其中的区域:

{% extends 'base.html' %}

{% block title %}Child Page{% endblock %}

{% block header %}
    <h1>Child Header</h1>
{% endblock %}

{% block content %}
    <p>Child Content</p>
{% endblock %}

在该模板中,我们使用 extends 标签来继承 base.html,并使用 block 标签重载了 title、header 和 content 区域。在渲染该模板时,Django 会自动将子模板中重载的区域插入到父模板中对应的位置,最终生成完整的 HTML 页面。

通过模板继承和重载功能,我们可以更加方便地管理和维护大型 Web 应用程序中的 HTML 结构和样式。

2.2 模板过滤器

Django 的模板过滤器可以对变量进行处理和格式化,常用的过滤器包括:

  • date:用于格式化日期。

  • length:用于获取列表长度。

  • upper 和 lower:用于将字符串转换为大写和小写。

  • join:用于将列表转换为字符串。

  • default:用于设置默认值。

例如,可以使用 date 过滤器来格式化日期:

<p>{{ date|date:"Y-m-d" }}</p>

使用 length 过滤器获取列表长度:

<p>{{ list|length }}</p>

使用 upper 和 lower 过滤器将字符串转换为大写和小写:

<p>{{ string|upper }}</p>
<p>{{ string|lower }}</p>

将日期格式化为指定的字符串。

  <p>{{ post.pub_date|date:"F j, Y" }}</p>

截取列表的一部分元素。

  <ul>
  {% for item in items|slice:":3" %}
      <li>{{ item }}</li>
  {% endfor %}
  </ul>

将文本中的URL自动转化为链接。

  <p>{{ post.content|urlize }}</p>

3. Django 模板语言实战

在实际的 Web 开发中,我们经常需要使用 Django 的模板语言来实现一些常用的功能。下面介绍几个实用的实战案例。

3.1 分页功能

在列表页面中,通常需要实现分页功能。Django 提供了内置的分页模块,可以帮助我们快速实现分页功能。首先,需要在视图函数中引入分页模块:

from django.core.paginator import Paginator

def list(request):
    items = Item.objects.all()
    paginator = Paginator(items, 10)
    page = request.GET.get('page')
    items = paginator.get_page(page)
    return render(request, 'list.html', {'items': items})

在模板中,可以使用分页模块提供的标签和过滤器来实现分页功能:

{% for item in items %}
    <p>{{ item.name }}</p>
{% endfor %}

{% if items.has_previous %}
    <a href="?page={{ items.previous_page_number }}">上一页</a>
{% endif %}

{% for i in items.paginator.page_range %}
    {% if items.number == i %}
        <strong>{{ i }}</strong>
    {% else %}
        <a href="?page={{ i }}">{{ i }}</a>
    {% endif %}
{% endfor %}

{% if items.has_next %}
    <a href="?page={{ items.next_page_number }}">下一页</a>
{% endif %}

3.2 表单验证功能

在表单页面通常需要验证用户输入的数据是否合法。Django 提供了内置的表单验证模块,可以帮助我们快速实现表单验证功能。首先需要定义一个表单类:

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(max_length=50)
    email = forms.EmailField()
    message = forms.CharField(widget=forms.Textarea)

这里定义了一个名为 ContactForm 的表单类,其中包含三个字段:name、email 和 message。name 字段使用了 CharField 类来验证用户输入的姓名,限制最大长度为 50 个字符;email 字段使用了 EmailField 类来验证用户输入的电子邮件地址,确保其符合电子邮件地址的格式;message 字段使用了 CharField 类,并使用了 Textarea 组件来允许用户输入多行文本信息。

在视图函数中,我们可以使用表单验证模块来验证用户输入的数据:

from django.shortcuts import render
from .forms import ContactForm

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # 处理用户输入的数据
            return HttpResponseRedirect('/thanks/')
    else:
        form = ContactForm()
    return render(request, 'contact.html', {'form': form})

在模板中,我们可以使用表单模块提供的标签和过滤器来快速渲染表单:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">提交</button>
</form>

技术总结

本文章介绍了 Django 的模板语言,包括模板文件的结构、模板的渲染方式、常用的模板标签和过滤器,以及实用的实战案例。

如果文章对你有所帮助,欢迎点赞收藏转发,感谢🙏

相关推荐
c4fx8 分钟前
Delphi5利用DLL实现窗体的重用
开发语言·delphi·dll
鸽芷咕32 分钟前
【Python报错已解决】ModuleNotFoundError: No module named ‘paddle‘
开发语言·python·机器学习·bug·paddle
Jhxbdks41 分钟前
C语言中的一些小知识(二)
c语言·开发语言·笔记
java66666888841 分钟前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存42 分钟前
源码分析:LinkedList
java·开发语言
子午43 分钟前
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
人工智能·python·cnn
代码雕刻家44 分钟前
数据结构-3.1.栈的基本概念
c语言·开发语言·数据结构
Fan_web1 小时前
JavaScript高级——闭包应用-自定义js模块
开发语言·前端·javascript·css·html
梦想科研社1 小时前
【无人机设计与控制】四旋翼无人机俯仰姿态保持模糊PID控制(带说明报告)
开发语言·算法·数学建模·matlab·无人机
风等雨归期1 小时前
【python】【绘制小程序】动态爱心绘制
开发语言·python·小程序