当前位置: 首页 > article >正文

Django模板及表单

什么是Django模板

Django模板是一种用于生成动态内容的文件,它使用Django模板语言(Django Template Language,简称DTL)来描述和渲染HTML页面。模板允许开发人员将动态数据与静态HTML结构分离,以实现更灵活和可维护的Web应用程序。Django模型特点如下:

  • 逻辑分离:模板允许将业务逻辑与呈现逻辑分离,使开发人员可以专注于数据处理和应用逻辑,而不必关注页面的具体呈现细节。
  • 可重用性:模板可以在不同的视图和应用程序之间共享和重用,提高代码的可维护性和重用性。
  • 动态内容:模板语言提供了一系列的标签、过滤器和变量,使开发人员能够在模板中插入动态内容,如变量、循环、条件语句等。
  • 继承和包含:模板支持继承和包含其他模板,以实现模块化和代码重用。
  • 安全性:Django模板引擎提供了一些安全机制,如自动转义,以防止跨站点脚本攻击(XSS)等安全问题。

Django模板的定义和使用

  1. 创建模板文件: 在应用的templates目录下,创建一个以.html为后缀的模板文件,如 my_template.html
<h1>{{ title }}</h1>
<ul>
    {% for item in items %}
        <li>{{ item }}</li>
    {% endfor %}
</ul>
  1. 编写模板内容: 在模板文件中,使用Django模板语言编写模板内容。模板语言提供了一系列的标签、过滤器和变量,用于插入动态内容、控制逻辑和循环等。

  2. 在视图中渲染模板: 在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})
  1. 在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自定义模板标签

  1. 创建模板标签文件: 在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()
  1. 编写自定义模板标签: 在模板标签文件中,编写自定义模板标签的代码。可以使用django.template.Library类来注册和定义自定义标签。
TEMPLATES = [
    {   ...
        'OPTIONS': {
            'context_processors': [ ... ],
            'libraries': {"custom_tags": "demo.templatetags.custom_tags"}
        },
    },
]
  1. 在项目设置TEMPLATS配置的OPTIONS.libraries中添加自定义的标签库。

  2. 在模板中使用自定义标签: 在模板中,可以使用{% 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、图像等静态资源,操作步骤如下: 1. 创建静态文件目录: 在Django项目的根目录下,创建一个名为static的目录。可以根据需要在static目录下创建子目录来组织静态文件。 2. 配置静态文件路径: 在Django项目的设置文件(settings.py)中,找到STATIC_URL和STATICFILES_DIRS两个设置项,并进行配置。

STATIC_URL = "static/"  # 静态文件的URL前缀
STATICFILES_DIRS = [    # 静态文件的存储路径,可以包含多个
    BASE_DIR / "static",
]
  1. 使用静态文件: 在模板中使用静态文件时,可以使用 {% 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数字输入框
GenericIPAddressFieldIP地址输入框
ImageField图片上传框
IntegerField数字输入框
JSONField多行文本框架
MultipleChoiceField多项选择框
NullBooleanField带None的真假值选择框
RegexField正则输入框
SlugField合法(变量)输入框
TimeField时间输入框
TypedChoiceField带类型的选择框
TypedMultipleChoiceField带类型的多选框架
URLFieldURL输入框
UUIDFieldUUID输入框

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

Django认证

什么是Django认证

Django认证的定义和使用

Django认证的用户和权限

Django认证的登录和注销

相关文章:

Django模板及表单

什么是Django模板 Django模板是一种用于生成动态内容的文件&#xff0c;它使用Django模板语言&#xff08;Django Template Language&#xff0c;简称DTL&#xff09;来描述和渲染HTML页面。模板允许开发人员将动态数据与静态HTML结构分离&#xff0c;以实现更灵活和可维护的W…...

两个mysql的maven依赖要用哪个?

背景 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> </dependency>和 <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId> &l…...

Kafka Consumer工作流程

Kafka Consumer工作流程图 1、启动与加入组 消费者启动后&#xff0c;会向 Kafka 集群中的某个 Broker 发送请求&#xff0c;请求加入特定消费者组。这个 Broker 中的消费者协调器&#xff08;Consumer Coordinator&#xff09;负责管理消费者组相关事宜。 2、组内分区分配&am…...

大腾智能 PDM 系统:全生命周期管理重塑制造企业数字化转型路径

在当今激烈的市场竞争中&#xff0c;产品迭代速度与质量已成为企业生存与发展的核心命脉。面对客户需求多元化、供应链协同复杂化、研发成本管控精细化等挑战&#xff0c;企业亟需一套能够贯穿产品全生命周期的数字化解决方案。 大腾智能PDM系统通过构建覆盖设计、研发、生产、…...

GATT 服务的核心函数bt_gatt_discover的介绍

目录 概述 1 GATT 基本概念 1.1 GATT 的介绍 1.2 GATT 的角色 1.3 核心组件 1.4 客户端操作 2 bt_gatt_discover函数的功能和应用 2.1 函数介绍 2.1 发现类型&#xff08;Discover Type&#xff09; 3 典型使用流程 3.1 服务发现示例 3.2 级联发现模式 3.3 按UUID过…...

【短距离通信】【WiFi】WiFi7关键技术之4096-QAM、MRU

目录 3. 4096-QAM 3.1 4096-QAM 3.2 QAM 的阶数越高越好吗&#xff1f; 4. MRU 4.1 OFDMA 和 RU 4.2 MRU 资源分配 3. 4096-QAM 摘要 本章主要介绍了Wi-Fi 7引入的4096-QAM对数据传输速率的提升。 3.1 4096-QAM 对速率的提升 Wi-Fi 标准一直致力于提升数据传输速率&a…...

C 语言学习笔记

文章目录 程序设计入门 --- C 语言第一周 程序设计与 C 语言1 计算机与编程语言:计算机怎么做事情的,编程语言是什么📒 1.1 计算机的普遍应用 —— 离了它,现代人可能不会“活”了**🌐 科学计算:计算机的“最强大脑”时刻****📊 数据处理:现代社会的“数字管家”***…...

【MySQL成神之路】MySQL函数总结

以下是MySQL函数的全面总结&#xff0c;包含概念说明和代码示例&#xff1a; 一、MySQL函数分类 1. 字符串函数 -- CONCAT&#xff1a;连接字符串 SELECT CONCAT(Hello, , World); -- 输出 Hello World -- SUBSTRING&#xff1a;截取子串 SELECT SUBSTRING(MySQL, 2, 3…...

线程池实战——数据库连接池

引言 作者在前面写了很多并发编程知识深度探索系列文章&#xff0c;反馈得知友友们收获颇丰&#xff0c;同时我也了解到友友们也有了对知识如何应用感到很模糊的问题。所以作者就打算写一个实战系列文章&#xff0c;让友友们切身感受一下怎么应用知识。话不多说&#xff0c;开…...

修改 vue-pdf 源码升级 pdfjs-dist 包, 以解决部分 pdf 文件显示花屏问题

文章目录 背景: 客户反馈有部分文件预览花屏 最终解决方案: 自己 fork vue-pdf 仓库, 修改 pdfjs-dist 版本, 升级到 3.3.122 (我是 vue2 项目 node 10 环境)修改源码中引用地址带有 pdfjs-dist/es5/ 的地方, 去掉 es5 , 另外如果还有报错自己搜一下 pdfjs-dist/ , 看看引用…...

基于moonshot模型的Dify大语言模型应用开发核心场景

基于moonshot模型的Dify大语言模型应用开发核心场景学习总结 一、Dify环境部署 1.Docker环境部署 这里使用vagrant部署&#xff0c;下载vagrant之后&#xff0c;vagrant up登陆&#xff0c;vagrant ssh&#xff0c;在vagrant 中使用 vagrant centos/7 init 快速创建虚拟机 安装…...

华为OD机试真题——字符串序列判定(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...

在Java的list.forEach(即 Stream API 的 forEach 方法)中,无法直接使用 continue 或 break 语句的解决办法

说明 在 Java 的 list.forEach&#xff08;即 Stream API 的 forEach 方法&#xff09;中&#xff0c;无法直接使用 continue 或 break 语句&#xff0c;因为它是一个终结操作&#xff08;Terminal Operation&#xff09;&#xff0c;依赖于 Lambda 表达式或方法引用。 有些时…...

Java面向对象高级学习笔记

面向对象高级 -类变量 类变量-提出问题 提出问题的主要目的就是让大家思考解决之道&#xff0c;从而引出我要讲的知识点 说:有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?&#xff0c;编写程序解决。 类变量快速入门 思考: 如果,设计一个int co…...

LLM之Agent:Mem0的简介、安装和使用方法、案例应用之详细攻略

LLM之Agent&#xff1a;Mem0的简介、安装和使用方法、案例应用之详细攻略 目录 Mem0的简介 1、Mem0的特点 2、性能&#xff1a; Mem0的安装及使用方法 1、安装 2、基本用法&#xff08;基本用法&#xff09; Mem0的案例应用 Mem0的简介 Mem0&#xff08;发音为“mem-ze…...

工商总局可视化模版-Echarts的纯HTML源码

概述 基于ECharts的工商总局数据可视化HTML模版&#xff0c;帮助开发者快速搭建专业级工商广告数据展示平台。这款模版设计规范&#xff0c;功能完善&#xff0c;适合各类工商监管场景使用。 主要内容 本套模版采用现代化设计风格&#xff0c;主要包含以下核心功能模块&…...

Spring AI 和 Elasticsearch 作为你的向量数据库

作者&#xff1a;来自 Elastic Josh Long, Philipp Krenn 及 Laura Trotta 使用 Spring AI 和 Elasticsearch 构建一个完整的 AI 应用程序。 Elasticsearch 原生集成了业界领先的生成式 AI 工具和服务提供商。查看我们关于超越 RAG 基础或使用 Elastic 向量数据库构建生产级应用…...

阿里云OSS Api工具类不使用sdk

本文工具实现了OSS简单的上传、下载、获取bucket列表功能&#xff0c;一个工具类搞定&#xff0c;不用集成oss sdk v1签名算法 v1算法&#xff08;v1算法将在2025年9月停用&#xff0c;旧的key不受影响&#xff0c;新key必须用v4&#xff09; v1签名工具类OssV1Signer.java …...

集群聊天服务器学习 配置开发环境(VScode远程连接虚拟机Linux开发)(2)

配置远程开发环境 第一步&#xff1a;Linux系统运行sshd服务 第二步&#xff1a;在vscode上安装Remote Deve I opment插件&#xff0c;其依赖插件会自动安装 第三步&#xff1a;配置远程Linux主机的信息 第四步&#xff1a;在vscode上开发远程连接Linux 第一步&#xff1a;…...

rabbitmq的使用介绍

一.队列工作模式介绍 1.WorkQueues模型 生产者直接把消息发送给队列&#xff0c;然后消费者订阅队列 特点: 消息不会重复, 分配给不同的消费者. 代码实现&#xff1a; 消费者代码&#xff1a; Component Slf4j public class SpringRabbitListener {RabbitListener(queues &q…...

前端的core-js是什么?有什么作用?

core-js 是前端生态中一个重要的 JavaScript 标准库 polyfill&#xff0c;它的主要作用是为不同浏览器环境提供 ECMAScript 最新特性 和 API 的兼容性支持。以下是其核心作用的详细解析&#xff1a; 一、core-js 是什么&#xff1f; 本质&#xff1a;一个模块化的 JavaScript …...

【Python 命名元祖】collections.namedtuple 学习指南

&#x1f4da; collections.namedtuple 学习指南 命名元组&#xff08;namedtuple&#xff09;是 Python collections 模块中一种增强型元组&#xff0c;支持通过字段名访问元素&#xff0c;同时保持元组的内存效率和不可变性。 一、基础用法 1. 定义命名元组 from collectio…...

系统编程day04

一.进程的基本概念 一.定义 进程是一个程序执行的过程&#xff08;也可以说是正在运行的程序&#xff09;&#xff0c;是系统分配资源的基本单位&#xff0c;由cpu对各个进程指挥调度&#xff0c;在单核cpu的情况下,各个进程可以通过一定规则在cpu上并发运行。 二.PCB块 1.PC…...

java 加密算法的简单使用

简介 加密算法&#xff0c;就是将原本的明文&#xff0c;通过一系列操作变成密文。在这里介绍一些常用的加密算法。在日常开发中&#xff0c;接触到了一些加密算法&#xff0c;例如&#xff0c;用户的隐私信息&#xff0c;诸如密码、手机号等&#xff0c;需要加密后存储到数据…...

Arduino Uno KY-037声音传感器实验

KY-037声音传感器实验 KY-037声音传感器实验1、 实验内容2、KY-037声音传感器介绍3、实验注意事项4、代码和实验现象 KY-037声音传感器实验 1、 实验内容 通过对KY-037声音传感器吹气&#xff0c;控制LED的打开和关闭&#xff0c;吹一下LED打开&#xff0c;在吹一下LED关闭。…...

机器学习---各算法比较

机器学习算法 线性回归 优点&#xff1a;简单&#xff1b;适用于大规模数据集。 缺点&#xff1a;无法处理非线性关系&#xff1b;对异常值敏感。 多项式回归 优点&#xff1a;捕捉特征和目标之间的非线性关系。 缺点&#xff1a;可能会过度拟合数据。 岭回归 优点&#…...

基于音频Transformer与动作单元的多模态情绪识别算法设计与实现(在RAVDESS数据集上的应用)

摘要&#xff1a;情感识别技术在医学、自动驾驶等多个领域的广泛应用&#xff0c;正吸引着研究界的持续关注。本研究提出了一种融合语音情感识别&#xff08;SER&#xff09;与面部情感识别&#xff08;FER&#xff09;的自动情绪识别系统。在SER方面&#xff0c;我们采用两种迁…...

Flink SQL 计算实时指标同比的实现方法

在 Flink SQL 中计算实时指标的同比(Year-on-Year),核心是通过时间窗口划分周期(如日、月、周),并关联当前周期与去年同期的指标值。以下是结合流数据处理特性的具体实现方法,包含数据准备、窗口聚合、历史数据关联等关键步骤。 一、同比的定义与场景 同比指当前周期指…...

什么是VR实景?有哪些高价值场景?

在数字化浪潮的推动下&#xff0c;虚拟现实技术正以前所未有的速度改变着我们的生活方式和工作模式。 其中&#xff0c;VR实景作为VR技术的一个重要应用场景&#xff0c;独特的沉浸感和交互性&#xff0c;在众多领域展现出应用潜力和高价值场景。什么是VR实景&#xff1f;VR实…...

基于MATLAB实现传统谱减法以及两种改进的谱减法(增益函数谱减法、多带谱减法)的语音增强

基于MATLAB实现传统谱减法以及两种改进的谱减法&#xff08;增益函数谱减法、多带谱减法&#xff09;的语音增强代码示例&#xff1a; 传统谱减法 function enhanced traditional_spectral_subtraction(noisy, fs, wlen, inc, NIS, a, b)% 参数说明&#xff1a;% noisy - 带…...