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

news/2024/11/19 18:07:24/

好的,下面将详细介绍 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:提供了一个强大的后台管理界面,允许您轻松管理模型数据,并支持自定义表单和界面。

http://www.ppmy.cn/news/1548288.html

相关文章

【ACM出版】第四届信号处理与通信技术国际学术会议(SPCT 2024)

& 第四届信号处理与通信技术国际学术会议&#xff08;SPCT 2024&#xff09; 2024 4th International Conference on Signal Processing and Communication Technology 2024年12月27-29日 中国深圳 www.icspct.com 第四届信号处理与通信技术国际学术会议&#x…

Python 正则表达式进阶用法:字符集与字符范围详解

Python 正则表达式进阶用法&#xff1a;字符集与字符范围详解 正则表达式是文本处理和数据清洗中不可或缺的工具。在前面的学习中&#xff0c;我们已经了解了基本的正则表达式匹配&#xff0c;如匹配单个字符、字符串开始和结束的位置等。今天&#xff0c;我们将进入正则表达式…

定时清理潜在客户列表中的无效邮箱可提高EDM电子邮件自动化营销邮件送达率

定时清理无效邮箱对于邮件营销来说&#xff0c;具有多重好处&#xff0c;这些好处直接关系到营销活动的效率、成本节约、品牌形象以及法律合规性。以下是几个关键方面&#xff1a; 提高邮件送达率&#xff1a; 无效邮箱&#xff08;如不存在、拼写错误或已废弃的邮箱地址&…

Filebeat升级秘籍:解锁日志收集新境界

文章目录 一、什么是filebeat二、Filebeat的工作原理2.1 filebeat的构成2.1.1 Prospector 组件2.1.2 Harvester 组件 2.2 filebeat如何保存文件的状态2.3 filebeat何如保证至少一次数据消费 三、Filebeat配置文件四、filebeat对比fluented五、Filebeat的部署安装5.1裸金属安装5…

基于Canny边缘检测和轮廓检测

这段代码实现了基于Canny边缘检测和轮廓检测&#xff0c;从图像中筛选出面积较大的矩形&#xff0c;并使用OpenCV和Matplotlib显示结果。主要流程如下&#xff1a; 步骤详解&#xff1a; 读取图像&#xff1a; img cv2.imread(U:/1.png)使用cv2.imread()加载图像。 转换为灰…

ES操作命令

1.查看索引 curl -XGET "http://localhost:9200/_cat/indices?v" 2.删除索引 curl -X DELETE "http://127.0.0.1:9200/indexName" 3.ES最大聚合参数设置 index.max_result_window的默认值通常是10000&#xff0c;如果你需要返回更多结果&#xff0c;…

hydra基础知识

hydra基础知识 1、yaml的使用 1.1 基础介绍 主要是用来写配置文件 优势: 层级式可以写注释安装: pip install pyyaml1.2 语法 2、omegaconf 2.1 基础介绍 为什么需要omegaconf? omegaconf主要是对python原生的字典,列表类型的增强,通过omegaconf能够更好的处理yaml…

鸿蒙中位置权限和相机权限

1.module.json5中添加相关权限和string.json中配置信息 2. import { hilog } from kit.PerformanceAnalysisKit; import { TAG } from ohos/hypium/src/main/Constant; import { bundleManager, common } from kit.AbilityKit; import { abilityAccessCtrl } from kit.Ability…