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

django从入门到精通(五)——表单与模型

好的,下面将详细介绍 Django 的表单与模型,包括它们的定义、使用、如何在 Django Admin 中结合使用,以及相关的字段类型和验证机制。

Django 模型与表单

1. Django 模型

Django 模型是一个 Python 类,用于定义数据库中的数据结构。每个模型类对应数据库中的一张表,类的属性对应表中的字段。

1.1 定义模型

模型通常在 models.py 文件中定义。以下是一个简单的模型示例:

from django.db import modelsclass Blog(models.Model):title = models.CharField(max_length=200)  # 标题content = models.TextField()                # 内容created_at = models.DateTimeField(auto_now_add=True)  # 创建时间updated_at = models.DateTimeField(auto_now=True)      # 更新时间def __str__(self):return self.title
1.2 模型字段

Django 提供了多种字段类型来定义模型的属性。常用的字段类型包括:

  • CharField: 用于存储短字符串,必须指定 max_length
  • TextField: 用于存储长文本。
  • IntegerField: 用于存储整数。
  • FloatField: 用于存储浮点数。
  • BooleanField: 用于存储布尔值。
  • DateTimeField: 用于存储日期和时间。
  • ForeignKey: 用于定义一对多关系。
  • ManyToManyField: 用于定义多对多关系。
1.3 元数据

模型的元数据通过 Meta 类定义。您可以在 Meta 类中指定表名、排序方式等。

class Blog(models.Model):title = models.CharField(max_length=200)content = models.TextField()class Meta:ordering = ['created_at']  # 按创建时间排序verbose_name = 'Blog Post'  # 单数形式verbose_name_plural = 'Blog Posts'  # 复数形式
1.4 数据迁移

在定义或修改模型后,您需要创建和应用迁移,以将模型的变化应用到数据库。

python manage.py makemigrations
python manage.py migrate

2. Django 表单

Django 表单是用于处理用户输入的类。表单可以通过 forms 模块定义,通常与模型结合使用,以便于数据验证和处理。

2.1 定义表单

您可以通过继承 forms.Formforms.ModelForm 来定义表单。

示例

from django import forms
from .models import Blogclass BlogForm(forms.ModelForm):class Meta:model = Blogfields = ['title', 'content']  # 指定要使用的字段
2.2 表单字段类型

Django 提供了多种表单字段类型,以便于处理不同类型的数据。常用的表单字段类型包括:

  • CharField: 用于输入短字符串。

    title = forms.CharField(max_length=100)
    
  • EmailField: 用于输入电子邮件地址,自动验证格式。

    email = forms.EmailField()
    
  • IntegerField: 用于输入整数,自动验证输入是否为整数。

    age = forms.IntegerField()
    
  • FloatField: 用于输入浮点数。

    price = forms.FloatField()
    
  • BooleanField: 用于输入布尔值(复选框)。

    is_active = forms.BooleanField(required=False)  # 可选
    
  • ChoiceField: 用于选择项,可以提供一个选项列表。

    color = forms.ChoiceField(choices=[('red', 'Red'), ('blue', 'Blue')])
    
  • MultipleChoiceField: 用于选择多个项。

    fruits = forms.MultipleChoiceField(choices=[('apple', 'Apple'), ('banana', 'Banana')])
    
  • DateField: 用于输入日期。

    birth_date = forms.DateField(widget=forms.SelectDateWidget())
    
  • FileField: 用于上传文件。

    file_upload = forms.FileField()
    
  • ImageField: 用于上传图像,自动验证文件类型。

    image_upload = forms.ImageField()
    
2.3 在视图中使用表单

在视图中,您可以实例化表单并处理用户提交的数据。

示例

from django.shortcuts import render, redirect
from .forms import BlogFormdef create_blog(request):if request.method == 'POST':form = BlogForm(request.POST)if form.is_valid():form.save()  # 保存有效的数据return redirect('blog_list')  # 重定向到博客列表页面else:form = BlogForm()return render(request, 'create_blog.html', {'form': form})
2.4 在模板中渲染表单

在模板中,您可以使用 Django 的模板语言渲染表单。

示例

<form method="post">{% csrf_token %}{{ form.as_p }}  <!-- 以段落形式渲染表单 --><button type="submit">提交</button>
</form>
2.5 调用表单方法

Django 表单提供了一些有用的方法,您可以在视图中调用它们:

  • is_valid(): 验证表单数据是否有效。

    if form.is_valid():# 处理有效数据
    
  • cleaned_data: 获取经过验证和清理的数据。

    title = form.cleaned_data['title']
    
  • save(): 在 ModelForm 中保存数据到数据库。

    form.save()
    
  • errors: 获取表单验证错误信息。

    if form.errors:print(form.errors)
    
  • add_error(): 向特定字段添加错误信息。

    form.add_error('title', '标题不能为空')
    
2.6 自定义验证

您可以通过重写 clean_<fieldname>() 方法来自定义字段验证。

示例

class BlogForm(forms.ModelForm):class Meta:model = Blogfields = ['title', 'content']def clean_title(self):title = self.cleaned_data.get('title')if 'badword' in title:raise forms.ValidationError("标题包含不当词汇。")return title

3. Django Admin 中的表单与模型

Django Admin 是一个强大的后台管理界面,允许您轻松管理模型数据。您可以通过注册模型和自定义表单来扩展 Django Admin 的功能。

3.1 注册模型

admin.py 文件中注册模型,以便在 Django Admin 中管理。

from django.contrib import admin
from .models import Blogadmin.site.register(Blog)
3.2 自定义 Admin 表单

您可以为 Django Admin 自定义表单,以便在管理界面中使用。

from django.contrib import admin
from .models import Blog
from .forms import BlogFormclass BlogAdmin(admin.ModelAdmin):form = BlogForm  # 使用自定义表单admin.site.register(Blog, BlogAdmin)
3.3 自定义 Admin 界面

您可以通过 ModelAdmin 类自定义 Django Admin 界面的外观和行为。

class BlogAdmin(admin.ModelAdmin):list_display = ('title', 'created_at')  # 显示的字段search_fields = ('title',)  # 搜索字段ordering = ('-created_at',)  # 排序方式admin.site.register(Blog, BlogAdmin)
3.4 处理表单提交

在 Django Admin 中,表单的提交和验证过程是自动处理的。您只需定义模型和表单,Django Admin 会处理数据的保存和验证。


4. 总结

  • 模型:用于定义数据库结构,每个模型类对应一张表,类的属性对应表中的字段。
  • 表单:用于处理用户输入,提供验证和清理功能,可以与模型结合使用。
  • Django Admin:提供了一个强大的后台管理界面,允许您轻松管理模型数据,并支持自定义表单和界面。

相关文章:

django从入门到精通(五)——表单与模型

好的&#xff0c;下面将详细介绍 Django 的表单与模型&#xff0c;包括它们的定义、使用、如何在 Django Admin 中结合使用&#xff0c;以及相关的字段类型和验证机制。 Django 模型与表单 1. Django 模型 Django 模型是一个 Python 类&#xff0c;用于定义数据库中的数据结…...

C语言Day 03 学习总结

Day 03 学习总结 流程控制语句 顺序结构 程序从上到下依次执行。每一条语句顺序执行&#xff0c;直到结束。 选择结构 程序根据条件选择执行某一条分支。包括 if-else 和 switch-case。 循环结构 程序反复执行某段代码。包括 for、while、do-while。 跳转结构 控制程序直接跳…...

kafka中是如何快速定位到一个offset的

定位到具体的segment日志文件&#xff0c;采用二分法先定位到index索引文件计算查找的offset在日志文件的相对偏移量 1、分区和日志段&#xff1a; 每个主题的分区&#xff08;Partition&#xff09;被划分为多个日志段&#xff08;Log Segment&#xff09;。每个日志段是一个…...

视频对接rtsp协议学习

RTSP协议在视频平台中的应用‌ RTSP&#xff08;Real Time Streaming Protocol&#xff09;是一种基于TCP/IP的应用层协议&#xff0c;主要用于控制流媒体数据的传输和播放。它通过定义一系列命令和请求&#xff0c;实现对流媒体服务器的远程控制&#xff0c;但不传输媒体数据…...

【系统架构设计师】真题论文: 论企业信息化规划的实施与应用(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2012年 试题4)解题思路论文素材参考企业信息化规划概念与主要内容企业信息化规划实施的步骤企业信息化规划的应用案例真题题目(2012年 试题4) 企业信息化建设是一项长期而艰巨的任务,不可能在短时间…...

【ARM Coresight OpenOCD 系列 6.1 -- JTAG Commands】

请阅读【嵌入式开发学习必备专栏】 文章目录 JTAG Transport使用场景配置示例JTAG Speed配置示例初始化过程中的速度调整自适应时钟选择合适的速度Low Level JTAG Commandsdrscanflush_countirscanpathmoveruntestverify_ircaptureverify_jtagJTAG Transport OpenOCD 是一个强…...

开源许可协议

何同学推动了开源协议的认识&#xff0c;功不可没&#xff0c;第一次对开源有了清晰的认识&#xff0c;最宽松的MIT开源协议 源自OSC开源社区&#xff1a;何同学使用开源软件“翻车”&#xff0c;都别吵了&#xff01;扯什么违反MIT...

241121学习日志——[CSDIY] [InternStudio] 大模型训练营 [11]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…...

跟千里马学框架 遇到的坑

在编译 aosp 的 所有的东西都是和他一样的&#xff0c; 但是出现了这个问题 emulator: command not found 明明所有的都是一样的但是出现了这个问题 &#xff0c; 啥情况 。 首先你的 ubuntu 要开启虚拟机 。 这个自己百度去 重新进行这些步骤 1、 . build/envsetup.s…...

Swift从0开始学习 协议和扩展 day5

协议:定义行为的契约 协议类似于其他语言中的接口。它们定义了一组方法、属性或其他需求,供结构体、类、枚举等类型去遵循和实现。协议并不实现这些需求,而是作为一种约定或合同,确保实现协议的类型会遵循特定的行为。 协议的定义和遵循 在 Swift 中,使用 protocol 关键…...

javaScript交互案例

1、模态框(弹出框) &#xff08;1&#xff09;、需求&#xff1a; 点击弹出层&#xff0c;会弹出模态框&#xff0c;并且显示灰色半透明的遮挡层点击关闭按钮&#xff0c;可以关闭模态框&#xff0c;并且同时关闭半透明遮挡层鼠标放在模态框最上面一行&#xff0c;可以按住鼠…...

【自动驾驶】数据集合集!

本文将为您介绍经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 1 Automatic-driving-Test 更新时间&#xff1a;2024-07-26 访问地址: GitHub 描述&#xff1a; 该模型使用 ultralytics yolo v8 和 deepsort 方法来检测车道与车轮的碰撞并跟踪车辆。…...

el-table表头前几列固定,后面几列根据接口返回的值不同展示不同

在使用 Element UI 的 el-table 组件时&#xff0c;如果想要实现表头的前几列固定&#xff0c;而后面的列根据接口返回的数据动态展示&#xff0c;可以通过以下步骤来实现&#xff1a; 1. 固定表头前几列 在 el-table-column 中使用 fixed 属性来固定表头的前几列。例如&…...

【Redis】redis缓存击穿,缓存雪崩,缓存穿透

一、什么是缓存&#xff1f; 缓存就是与数据交互中的缓冲区&#xff0c;它一般存储在内存中且读写效率高&#xff0c;提高响应时间提高并发性能&#xff0c;如果访问数据的话可以先访问缓存&#xff0c;避免数据查询直接操作数据库&#xff0c;造成后端压力过大。 但是可能会面…...

HBase Flink操作

Apache Flink 是一个开源的分布式流处理框架&#xff0c;能够高效地处理和分析实时数据流以及批数据。HBase 是一个分布式、面向列的开源数据库&#xff0c;是 Hadoop 项目的子项目&#xff0c;适合非结构化数据结构的存储&#xff0c;并提供实时读写能力。以下是关于 Flink 对…...

C# .Net Core通过StreamLoad向Doris写入CSV数据

以下代码可以只关注StreamLoad具体实现。 1.创建StreamLoad返回值Model public class StreamLoadResponse {public long TxnId { get; set; }public string Label { get; set; }public string Comment { get; set; }public string TwoPhaseCommit { get; set; }public string…...

React-自定义Hook与逻辑共享

#题引&#xff1a;我认为跟着官方文档学习不会走歪路 在 React 中&#xff0c;自定义 Hook 是一种复用逻辑的方式。自定义 Hook 是一个 JavaScript 函数&#xff0c;名称以 use 开头&#xff0c;可以调用其他的 Hook, 可以返回任意值。 创建自定义Hook 假设你正在开发一款重…...

蓝桥杯每日真题 - 第17天

题目&#xff1a;&#xff08;最大数字&#xff09; 题目描述&#xff08;13届 C&C B组D题&#xff09; 题目分析&#xff1a; 操作规则&#xff1a; 1号操作&#xff1a;将数字加1&#xff08;如果该数字为9&#xff0c;变为0&#xff09;。 2号操作&#xff1a;将数字…...

游戏开发实现简易实用的ui框架

游戏开发实现简易实用的ui框架 本文使用cocos引擎实现&#xff0c;框架代码本质上不依赖某一个引擎&#xff0c;稍作修改也能作为其他引擎的实现 1.1 UI管理框架的核心需求剖析 分层与类型管理 对不同类型UI需要进行分层管理。不同层级的UI需要有不同的父节点&#xff0c;保证渲…...

vue3的attr透传属性详解和使用法方式。以及在css样式的伪元素中实现

在 Vue 3 和 TypeScript 中&#xff0c;属性透传&#xff08;attr pass-through&#xff09;是指将组件的属性传递到其根元素或某个子元素中。这个概念在开发可复用的组件时非常有用&#xff0c;尤其是当你希望将父组件的属性动态地传递给子组件的某个 DOM 元素时。 在 Vue 3 …...

【仿真建模-MESA】框架简介

1. 简介 Mesa是一个基于Python3的开源项目&#xff0c;旨在提供一个现代、易用的多智能体仿真环境。它借鉴了NetLogo、Repast和MASON等多智能体仿真框架的优点&#xff0c;并结合Python语言的强大功能&#xff0c;为用户提供了丰富的建模和仿真工具。 《官方文档》 2. 核心组件…...

Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)

目录 Linux软件包管理器 - yum Linux下安装软件包的方式 认识yum 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 批量化注释 vim的简单配置 Linux编译器 - gcc/g gcc/g的作用 gcc/g语…...

VSCode 间距太小

setting->font family 使用&#xff1a;Consolas, Courier New, monospace 字体...

【K8S系列】imagePullSecrets配置正确,但docker pull仍然失败,进一步排查详细步骤

如果 imagePullSecrets 配置正确,但在执行 docker pull 命令时仍然失败,可能存在以下几种原因。以下是详细的排查步骤和解决方案。 1. 检查 Docker 登录凭证 确保你使用的是与 imagePullSecrets 中相同的凭证进行 Docker 登录: 1.1 直接登录 在命令行中,执行以下命令: …...

【ARM Coresight OpenOCD 系列 5.1 -- OpenOCD 无法识别CPUID 问题: xxx is unrecognized】

请阅读【嵌入式开发学习必备专栏】 文章目录 OpenOCD 无法识别CPUID 问题ARM CPUIDCPUID 特性CPUID 寄存器字段OpenOCD 无法识别CPUID 问题 在使用OpenOCD 进行CPU debug的过程中有时会报出 无法识别CPUID的问题,本文将会介绍如何解决这个问题。首先我们来学习下什么是CPUID,…...

如何实现点击目录跳转到指定位置?【vue】

需求&#xff1a;实现目录点击跳转到指定位置&#xff0c;点击后直接定位到指定模块 效果&#xff1a; 实现方法&#xff1a; &#xff08;1&#xff09;a标签跳转 普通使用&#xff1a; <!DOCTYPE html> <html><head><title>a-Demo</title>&l…...

SQL 通配符

SQL 通配符 在SQL中&#xff0c;通配符是一种特殊字符&#xff0c;用于在LIKE子句中搜索数据。它们主要用于模式匹配&#xff0c;允许你搜索符合特定模式的值。SQL中的通配符通常用于SELECT、UPDATE和DELETE语句中&#xff0c;以增加查询的灵活性。本文将详细介绍SQL中常用的通…...

ubuntu显示管理器_显示导航栏

ubuntu文件管理器_显示导航栏 一、原始状态&#xff1a; 二、显示导航栏状态&#xff1a; 三、原始状态--->导航栏状态: 1、打开dconf编辑器&#xff0c;直接在搜索栏搜索 dconf-editor ------如果没有安装&#xff0c;直接按流程安装即可。 2、进入目录&#xff1a;org …...

黑芝麻嵌入式面试题及参考答案

请详细描述二叉树的深度优先搜索(dfs)流程。 深度优先搜索是一种用于遍历二叉树的重要算法,主要有先序遍历、中序遍历和后序遍历三种方式。 先序遍历的流程是,首先访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。这就好比是在探索一个家族树,先拜访家族中的长辈…...

使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程

当涉及到图数据时&#xff0c;复杂性是不可避免的。无论是社交网络中的庞大互联关系、像 Freebase 这样的知识图谱&#xff0c;还是推荐引擎中海量的数据量&#xff0c;处理如此规模的图数据都充满挑战。 尤其是当目标是生成能够准确捕捉这些关系本质的嵌入表示时&#xff0c;…...