...

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 数字输入框
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

Django认证

什么是Django认证

Django认证的定义和使用

Django认证的用户和权限

Django认证的登录和注销

posted @ 2023-10-10 10:46  韩志超  阅读(178)  评论(0编辑  收藏  举报