Django模板及表单
什么是Django模板
Django模板是一种用于生成动态内容的文件,它使用Django模板语言(Django Template Language,简称DTL)来描述和渲染HTML页面。模板允许开发人员将动态数据与静态HTML结构分离,以实现更灵活和可维护的Web应用程序。Django模型特点如下:
- 逻辑分离:模板允许将业务逻辑与呈现逻辑分离,使开发人员可以专注于数据处理和应用逻辑,而不必关注页面的具体呈现细节。
- 可重用性:模板可以在不同的视图和应用程序之间共享和重用,提高代码的可维护性和重用性。
- 动态内容:模板语言提供了一系列的标签、过滤器和变量,使开发人员能够在模板中插入动态内容,如变量、循环、条件语句等。
- 继承和包含:模板支持继承和包含其他模板,以实现模块化和代码重用。
- 安全性:Django模板引擎提供了一些安全机制,如自动转义,以防止跨站点脚本攻击(XSS)等安全问题。
Django模板的定义和使用
- 创建模板文件: 在应用的templates目录下,创建一个以.html为后缀的模板文件,如 my_template.html
<h1>{{ title }}</h1>
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
-
编写模板内容: 在模板文件中,使用Django模板语言编写模板内容。模板语言提供了一系列的标签、过滤器和变量,用于插入动态内容、控制逻辑和循环等。
-
在视图中渲染模板: 在Django的视图函数或类中,使用模板引擎来渲染模板并生成最终的HTML内容。可以使用render()函数或TemplateResponse类来完成渲染过程。
from django.shortcuts import render
def my_view(request):
title = "欢迎使用Django模板"
items = ["苹果", "香蕉", "橙子"]
return render(request, 'my_template.html', {'title': title, 'items': items})
- 在URL配置中指定视图: 在Django的URL配置文件中,将视图函数或类与特定的URL路径进行关联,以便在浏览器中访问该URL时调用相应的视图函数。
from django.urls import path
from .views import my_view
urlpatterns = [
path('my-view/', my_view, name='my-view'),
]
Django模板变量与标签
参考:模板
- 变量:
{{ 变量 }}
,支持使用'.'获取属性或Item。{{ obj.attibute }}
{{ dct.key }}
{{ lst.0 }}
- 标签:
{% 标签 '参数1' '参数2' %}
- for循环
{% for item in books %} ... {% endfor %}
- if判断
{% if book.name == 'Zoo' %} .. {% else %} ... {% endif %}
- 过滤器:
{{ my_date|date:'Y-m-d' }}
转换变量和标签参数的值
- 注释:
- 单行注释:
{# this won't be rendered #}
- 多行注释
{% comment %} ... {% endcomment %}
- 单行注释:
常用内置标签
参考:内置模板标签和过滤器
- block:标记或实现一个占位区域
{% block 'title' %}{% endblock %}
- extends:继承模板或变量
{% extends 'base.html' %}
- include: 引入(嵌套)另一个页面
{% include 'project_table.html' %}
- load:加载自定义模板标签集
{% load static %}
- url:通过url名称获取url地址,支持参数
{% url 'project_page' %}
- csrf_token:为表单添加CSRF token
- for循环:
{% for x, y in points %} {% endfor %}
,支持{% empty %}
处理空值 - if判断:
{% if a > 0 %} ... {% elif ... %} {% else %} {% endif %}
- ifchanged: 在循环中检查值是否变化
- cycle: 循环输出
{% cycle 'row1' 'row2' %}
- firstof: 输出第一个不为假的值
- with: 变量别名
常用内置过滤器
参考:内置模板标签和过滤器
- escape: 转义HTML,< 被替换为 <> 被替换为 > ...
- safe: 标记一个字符串不需要转义
- slice: 切片
- join: 连接列表为字符串
- make_list: 转列表
- lower / upper: 转小写 / 大写
- first / last: 输出列表第一个 / 最后一个
- length: 输出列表或字符串长度
- ... ...
Django自定义模板标签
- 创建模板标签文件: 在Django项目的某个应用程序目录下,创建一个名为templatetags的子目录。在templatetags目录下,创建一个Python文件(例如custom_tags.py),用于定义自定义模板标签。
from django import template
from ..models import Project
register = template.Library()
@register.simple_tag
def project_count():
return Project.objects.count()
- 编写自定义模板标签: 在模板标签文件中,编写自定义模板标签的代码。可以使用django.template.Library类来注册和定义自定义标签。
TEMPLATES = [
{ ...
'OPTIONS': {
'context_processors': [ ... ],
'libraries': {"custom_tags": "demo.templatetags.custom_tags"}
},
},
]
-
在项目设置TEMPLATS配置的OPTIONS.libraries中添加自定义的标签库。
-
在模板中使用自定义标签: 在模板中,可以使用{% load %}标签来加载自定义模板标签文件,并使用自定义标签。
{% load custom_tags %}
<div>项目数:{% project_count %}</div>
Django模板继承和包含
模板继承
Django模板继承是一种在多个模板之间共享通用结构和内容的机制。通过使用模板继承,可以创建一个基础模板(父模板),其中包含通用的HTML结构和布局,然后在子模板中继承该基础模板并添加特定的内容。
base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
project.html
{% extends 'base.html' %}
{% block title %}项目{% endblock %}
{% block content %}
<h1>项目列表</h1>
{% endblock %}
模板包含
Django模板包含是一种在模板中重用其他模板的机制。通过使用模板包含,可以将一个或多个模板的内容嵌入到另一个模板中,以实现代码的重用和模块化。
project_table.html
<table>
<thead><tr><th>项目名称</th><th>项目描述</th></tr></thead>
<tbody><tr><td>项目1</td><td>项目1描述</td></tr></tbody>
</table>
project.html
{% extends 'base.html' %}
{% block title %}项目{% endblock %}
{% block content %}
<h1>项目列表</h1>
{% include 'project_table.html' %}
{% endblock %}
Django使用静态文件
在Django中,如果需要使用CSS、JavaScript、图像等静态资源,操作步骤如下:
- 创建静态文件目录: 在Django项目的根目录下,创建一个名为static的目录。可以根据需要在static目录下创建子目录来组织静态文件。
- 配置静态文件路径: 在Django项目的设置文件(settings.py)中,找到STATIC_URL和STATICFILES_DIRS两个设置项,并进行配置。
STATIC_URL = "static/" # 静态文件的URL前缀
STATICFILES_DIRS = [ # 静态文件的存储路径,可以包含多个
BASE_DIR / "static",
]
- 使用静态文件: 在模板中使用静态文件时,可以使用 {% static %} 模板标签, 注意使用static标签需要手动加载。
{% load static %}
<link rel="stylesheet" href="{% static 'css/style.css' %}">
<img src="{% static 'images/logo.png' %}" alt="Logo">
Django表单
什么是Django表单
在Django中,表单(Form)是一种用于处理用户输入数据的工具。Django的表单提供了一种简单且强大的方式来创建、验证和处理用户提交的数据。
Django表单的主要目的是收集用户输入的数据,并对其进行验证和处理。它可以用于创建各种类型的表单,如用户注册、登录、数据编辑等。
Django表单的定义和使用
定义表单类
from django import forms
class AddProjectForm(forms.Form):
name = forms.CharField(label='项目名', max_length=128, widget=forms.TextInput())
description = forms.CharField(label='项目描述', widget=forms.Textarea())
渲染表单
<form action="/add" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="提交">
</form>
{{ form.as_div }}
{{ form.as_table }}
{{ form.as_p }}
{{ form.as_ul }}
{% for field in form %} {{ filed.label}} {{ filed }} { % endfor %}
处理表单数据
from .forms import AddProjectForm
def add_project(request):
form = AddProjectForm(request.POST)
if form.is_valid():
name = form.cleaned_data[‘name’]
description = form.cleaned_data[‘description’]
Project(name=name, description=description).save()
return redirect('project_page')
Django模型表单的定义和使用
定义模型表单类
from django import forms
from .models import Project
class AddProjectForm(forms.ModelForm):
class Meta:
model = Project
fields = ['name', 'description']
渲染表单
<form action="/add" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="提交">
</form>
处理表单数据
from .forms import AddProjectForm
def add_project(request):
form = AddProjectForm(request.POST)
if form.is_valid():
form.save()
return redirect('project_page')
Django表单集Fromset
定义表单类
from django import forms
class AddProjectForm(forms.Form):
name = forms.CharField(label='项目名', max_length=128, widget=forms.TextInput())
description = forms.CharField(label='项目描述', widget=forms.Textarea())
渲染表单集
<form method="post">
{% csrf_token %}
{% for form in formset %}
{{ form.as_table }}
{% endfor %}
<input type="submit" value="提交">
</form>
处理表单数据
from django.forms import formset_factory
from .forms import AddProjectForm
AddProjectFormSet = formset_factory(AddProjectForm, extra=3)
def add_project(request):
formset = AddProjectFormSet(request.POST)
if formset.is_valid():
# 处理有效的表单数据
for form in formset:
pass
return redirect('project_page')
Django表单字段参数及方法
参数 | 说明 |
---|---|
required | 是否必填 |
label | 字段标签 |
label_suffix | 字段标签后缀 |
initial | 初始值 |
widget | 指定控件 |
help_text | 帮助文本 |
error_messages | 出错消息 |
validators | 自定义验证器 |
localize | 国际化 |
disabled | 禁用 |
has_changed() | 字段数据是否被用户修改 |
Django表单内置表单字段
参数 | 说明 |
---|---|
BooleanField | 真假值选择框 |
CharField | 输入框/多行输入框 |
ChoiceField | 下拉选择框 |
DateField | 日期输入框 |
DateTimeField | 日期时间输入框 |
DecimalField | 数字输入框 |
DurationField | 耗时输入框 |
EmailField | 邮件地址输入框 |
FileField | 文件上传框 |
FilePathField | 下拉选择框 |
FloatField | 数字输入框 |
GenericIPAddressField | IP地址输入框 |
ImageField | 图片上传框 |
IntegerField | 数字输入框 |
JSONField | 多行文本框架 |
MultipleChoiceField | 多项选择框 |
NullBooleanField | 带None的真假值选择框 |
RegexField | 正则输入框 |
SlugField | 合法(变量)输入框 |
TimeField | 时间输入框 |
TypedChoiceField | 带类型的选择框 |
TypedMultipleChoiceField | 带类型的多选框架 |
URLField | URL输入框 |
UUIDField | UUID输入框 |
Django表单内置Widgets控件
输入框
- TextInput:普通文本输入框
- NumberInput:数字输入框
- EmailInput:邮件输入框
- URLInput:URL输入框
- PasswordInput:密码输入框
- HiddenInput:隐藏数日
- DateInput:日期输入框
- DateTimeInput:日期时间输入框
- TimeInput:时间输入框
- Textarea:多行文本框架
多项选择框(下拉或checkbox)
- CheckboxInput:checkbox输入框
- Select:下拉框
- NullBooleanSelect:带None值的真假值选择框
- SelectMultiple:多项选择框架
- RadioSelect:radio单选框
- CheckboxSelectMultiple:checkbox多选框架
- 文件上传框
- FileInput:文件上传框
- ClearableFileInput:带清空的文件上传框
复合控件
- MultipleHiddenInput
- SplitDateTimeWidget
- SplitHiddenDateTimeWidget
- SelectDateWidget