当前位置: 首页 > 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认证的登录和注销

http://www.lryc.cn/news/2386180.html

相关文章:

  • 两个mysql的maven依赖要用哪个?
  • Kafka Consumer工作流程
  • 大腾智能 PDM 系统:全生命周期管理重塑制造企业数字化转型路径
  • GATT 服务的核心函数bt_gatt_discover的介绍
  • 【短距离通信】【WiFi】WiFi7关键技术之4096-QAM、MRU
  • C 语言学习笔记
  • 【MySQL成神之路】MySQL函数总结
  • 线程池实战——数据库连接池
  • 修改 vue-pdf 源码升级 pdfjs-dist 包, 以解决部分 pdf 文件显示花屏问题
  • 基于moonshot模型的Dify大语言模型应用开发核心场景
  • 华为OD机试真题——字符串序列判定(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • 在Java的list.forEach(即 Stream API 的 forEach 方法)中,无法直接使用 continue 或 break 语句的解决办法
  • Java面向对象高级学习笔记
  • LLM之Agent:Mem0的简介、安装和使用方法、案例应用之详细攻略
  • 工商总局可视化模版-Echarts的纯HTML源码
  • Spring AI 和 Elasticsearch 作为你的向量数据库
  • 阿里云OSS Api工具类不使用sdk
  • 集群聊天服务器学习 配置开发环境(VScode远程连接虚拟机Linux开发)(2)
  • rabbitmq的使用介绍
  • 前端的core-js是什么?有什么作用?
  • 【Python 命名元祖】collections.namedtuple 学习指南
  • 系统编程day04
  • java 加密算法的简单使用
  • Arduino Uno KY-037声音传感器实验
  • 机器学习---各算法比较
  • 基于音频Transformer与动作单元的多模态情绪识别算法设计与实现(在RAVDESS数据集上的应用)
  • Flink SQL 计算实时指标同比的实现方法
  • 什么是VR实景?有哪些高价值场景?
  • 基于MATLAB实现传统谱减法以及两种改进的谱减法(增益函数谱减法、多带谱减法)的语音增强
  • 同一无线网络下的设备IP地址是否相同?