Django Form实现表单使用及应用场景

news2024/11/24 5:44:54

首先需要定义一个使用场景:

音乐网站的前端部分可以添加上传歌手的单曲,

这个添加页面就使用django form表单来实现。

目录

数据表内容

歌手表及表模型

单曲表及表模型

演示表单使用

设置路由

创建form.py

视图实例化表单类

模板使用表单对象

表单使用进阶

优化表单类

视图表单使用

总结


数据表内容

下方实现功能时,涉及到一些表的数据操作,所以我把表模型内容粘贴出来。

这样有助于整体理解form使用。

歌手表及表模型

在子应用的models.py中的设定歌手表结构,这里由于在后台有一些功能实现,所以内容较多。

不必过多关注歌手表,因为是单曲添加只是涉及一部分歌手表内容,主要集中在使用单曲表使用。

内容如下:

class BaseModel(models.Model):
    """ 设置基础模型类 """

    addtime = models.DateTimeField(auto_now_add=True)
    updatetime = models.DateTimeField(auto_now=True)

class Singler(BaseModel):
    """ 歌手表模型 """

    class Meta:
        verbose_name = '歌手'
        verbose_name_plural = '歌手'
        # 正序
        ordering = ['first_letter']

    name = models.CharField(
        '姓名',
        max_length=50,
        help_text='请输入歌手名称'
    )
    first_letter = models.CharField(max_length=15, editable=False)
    # 设置上传位置
    portrait = models.ImageField(
        '照片',
        upload_to=upload_save_path,
        help_text='请上传歌手照片'
    )
    birthday = models.DateField(
        '生日',
        default=date.today,
        help_text='请选择歌手生日',
        blank=True
    )
    height = models.IntegerField(
        '身高(cm)',
        help_text='请输入歌手身高(cm)',
        default=0,
        blank=True
    )
    weight = models.IntegerField(
        '体重(kg)',
        help_text='请输入歌手体重(kg)',
        default=0,
        blank=True
    )
    constellation = models.CharField(
        '星座',
        max_length=50,
        help_text='请输入歌手星座'
    )
    english_name = models.CharField(
        '英文名',
        max_length=50,
        help_text='请输入歌手英文名',
        default='-'
    )
    gender = models.IntegerField(
        '性别',
        help_text='请选择歌手性别',
        choices=((0, '女'), (1, '男')),
        default=1
    )
    country_name = models.CharField(
        '国籍',
        max_length=50,
        help_text='请输入歌手国籍',
        default='-'
    )
    # editable=False 后台将不再显示
    singe_num = models.IntegerField(
        default=0,
        editable=False
    )
    album_num = models.IntegerField(
        default=0,
        editable=False
    )
    desc = models.TextField(
        '简介',
        help_text='请输入歌手简介'
    )

    def __str__(self):
        """ 修改返回格式 """

        return self.name

执行过表迁移后,添加部分数据。

表字段和记录内容如下:

单曲表及表模型

在子应用的models.py中的设定单曲表结构,在这里定义了单曲表所有字段,

一会在添加功能时候,需要实现单曲中这些字段资料的添加。

class Singe(BaseModel):
    """ 单曲表 """

    class Meta:
        verbose_name = '单曲'
        verbose_name_plural = '单曲'

    name = models.CharField(
        '单曲名称',
        max_length=50,
        help_text='请输入单曲名称',
    )
    duration = models.IntegerField(editable=False, default=0)

    playnum = models.IntegerField(default=0, editable=False)

    path = models.FileField(
        '歌曲文件',
        upload_to=upload_save_path,
        help_text='请上传歌曲',
    )
    lyric = models.FileField(
        '歌曲歌词',
        upload_to=upload_save_path,
        help_text='请上传歌曲歌词',
    )

    # 设置与歌手表关联外键 一对多外键设置在多的模型中
    singler = models.ForeignKey(
        "Singler",
        on_delete=models.CASCADE,
        verbose_name='歌手',
        help_text='请选择歌手'
    )

执行过表迁移后,添加部分数据。

表字段和记录内容如下:

演示表单使用

传统的表单生成方式是在模板文件中编写HTML代码实现。一个完整的表单主要由4部分组成:提交地址、请求方式、元素控件和提交按钮。提交地址和请求方式由form标签设置,提交按钮具有一定特殊性,不通过django form表单来实现。其他文本框、下拉框、复选框等可由django form表单的元素控件来实现。可以简化表单的实现过程和提高表单的灵活性。

设置路由

在urls.py中设置路由地址。

path('test', views.test, name='test'),

创建form.py

在子项目目录下创建form.py,在其中定义表单类testForm。

名称可以使用charField类型来实现,文件用fileField类型实现。

但是下拉菜单必须使用choiceField类型实现;与表模型类设置有所不同。

内容如下:

from django import forms
from .models import *


class SingeForm(forms.Form):
    name = forms.CharField(max_length=20, label='单曲名称')
    path = forms.FileField(label='单曲文件')
    lyric = forms.FileField(label='歌词文件')
    # 设置下拉菜单
    names = Singler.objects.all()
    # 将数据以列表的形式标识,列表元素为元组的格式
    singers = [(v.id, v.name) for v in names]
    singer = forms.ChoiceField(label='所属歌手', choices=singers)

视图实例化表单类

视图调用表单并传参给模板。

内容如下:

from .form import *
def test(request):
    """ 演示form使用 """

    v = SingeForm()
    return render(request, 'test/index.html', locals())

模板使用表单对象

在这里需要判断是否有错误返回,没有错误正常显示添加表单。

<!DOCTYPE html>
<html>
<body>
<h2>添加歌手单曲</h2>
{% if v.errors %}
    <p>操作失败,问题是:{{ v.errors }}</p>
{% else %}
    {# 表单 #}
    <form action="" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <table>
            {{ v }}
        </table>
        <input type="submit" value="保存">
    </form>
    {# 表单 #}
{% endif %}
</body>
</html>

注意:没有填写提交地址,默认提交本路由。

效果:

浏览器访问,展示表单。

表单使用进阶

在表单演示使用基础上,增加对表单参数的验证,数据处理并添加入库。

优化表单类

在原来基础上,增加单曲名称、单曲文件格式、歌词文件格式自定义验证。

自定义必填提示语内容。

内容如下:

from django import forms
from .models import *
from django.core.exceptions import ValidationError


def check_name(value):
    if len(value.encode('utf-8')) > 60:
        raise ValidationError('单曲名称不可超过20个字!')


def check_singe(value):
    path_name = str(value)
    if not path_name.endswith(".mp3"):
        raise ValidationError('单曲文件格式为mp3文件!')


def check_lyric(value):
    path_name = str(value)
    if not path_name.endswith(".lrc"):
        raise ValidationError('歌词文件格式为lrc文件!')


class SingeForm(forms.Form):
    name = forms.CharField(
        max_length=20,
        label='单曲名称',
        error_messages={'required': '单曲名称不可为空'},
        validators=[check_name])
    path = forms.FileField(
        label='单曲文件',
        error_messages={'required': '请上传单曲文件'},
        validators=[check_singe]
    )
    lyric = forms.FileField(
        label='歌词文件',
        error_messages={'required': '请上传歌词文件'},
        validators=[check_lyric]
    )
    # 设置下拉菜单
    names = Singler.objects.all()
    # 将数据以列表的形式标识,列表元素为元组的格式
    singers = [(v.id, v.name) for v in names]
    singer = forms.ChoiceField(label='所属歌手', choices=singers)

视图表单使用

增加文件上传、歌曲时长计算、单曲关联歌手并增加相应歌手单曲数;

如果验证不通过,返回错误信息。

这里通过请求的方法进行判断,如果是GET就把表单显示到模板中。

如果是POST请求,就需要把请求获得的参数传递到form表单中,来实现表单验证数据。

这里需要注意的是:如果有文件上传需要设置模板中表单的enctype="multipart/form-data";

因为请求的文件需要单独的获取,故还要再把文件参数单独传给表单。否则就会提示没有上传文件。

下面就是文件上传,保存到服务器端,获取上传文件路径,拿歌曲路径获取歌曲时长。

然后模型操作:单曲的新增,关联歌手相应记录;最后更新相应歌手单曲数。

内容如下:

from .form import *
from django.http import HttpResponse
import eyed3


def test(request):
    """ 演示form使用 """

    if request.method == 'GET':
        v = SingeForm()
        return render(request, 'test/index.html', locals())
    else:
        v = SingeForm(data=request.POST, files=request.FILES)
        if v.is_valid():
            singe_path = save_media(request.FILES['path'])
            # 上传单曲文件
            singe_path = save_media(request.FILES['path'])
            # 上传歌词文件
            lyric_path = save_media(request.FILES['lyric'])
            # 计算单曲时长
            duration = get_duration_mp3(singe_path)
            # 查询歌手
            singer_id = v.cleaned_data['singer']
            singerDb = Singler.objects.filter(id=singer_id).first()
            # 新增单曲
            singeDb = Singe()
            singeDb.name = v.cleaned_data['name']
            singeDb.duration = duration
            singeDb.path = singe_path
            singeDb.lyric = lyric_path
            # 建立关联
            singeDb.singler = singerDb
            singeDb.save()
            # 歌手增加单曲数
            singerDb.singe_num = singerDb.singe_num + 1
            singerDb.save()
            return HttpResponse('操作成功!')
        else:
            # 获取错误信息,并以json格式返回
            error_msg = v.errors.as_json()
            return render(request, 'test/index.html', locals())


def save_media(file):
    """ 保存文件到服务器 """

    path = os.path.join(settings.MEDIA_ROOT, file.name)
    with open(path, 'wb+') as fp:
        for info in file.chunks():
            fp.write(info)
    return path


def get_duration_mp3(file_path):
    """ 获取mp3音频文件时长 """

    info = eyed3.load(file_path)
    return int(info.info.time_secs)

效果:

验证不通过:

验证通过:

 

总结

Django的表单功能是通过定义表单类,再由类的实例化生成HTML的表单元素控件,这样可以在模板文件中减少HTML的硬编码。每个HTML的表单元素控件由表单字段来决定。并且可以使用表单来进行服务端验证,把验证内容跟逻辑处理进行分离。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/989563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

个人用户怎么免费使用电子签章平台,制作能在手机上双方都可以签字的租房合同?

环境 苹果11Pro手机 微信小程序 腾讯电子签 PDF版租房合同 问题描述 最近租房要续签合同&#xff0c;房东在外地&#xff0c;怎么免费使用有规范的合同电子签约平台制作电子签章&#xff0c;双方都能在手机上签合同&#xff0c;完成线上签约 解决方案 1.首先打开微信在搜…

【面试经典150 | 双指针】验证回文串

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;筛选判断方法二&#xff1a;原地判断 知识回顾回文串双指针字符串操作 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分…

【数据结构】二叉树的顺序结构实现及时间复杂度计算(二)

目录 一&#xff0c;二叉树的顺序结构实现 1&#xff0c;二叉树的顺序结构 2&#xff0c;堆的概念及结构 3&#xff0c;堆的接口实现 1&#xff0c;堆的创建 2&#xff0c;接口函数 3&#xff0c;初始化 4&#xff0c;销毁 5&#xff0c;是否增容 6&#xff0c;交换数据…

Redis基础详解

目录 一、概述 redis作用 redis特性 二、Redis基础知识 为什么Redis是单线程的&#xff1f; Redis的高并发和快速原因&#xff1f; Redis6.0 之后为何引入了多线程&#xff1f; 三、Redis五大数据类型&#xff0c;三种特殊数据类型 启动Redis Redis-Key String&#…

UMA 2 - Unity Multipurpose Avatar☀️三.给UMA设置默认服饰Recipes

文章目录 🟥 项目基础配置🟧 给UMA配置默认服饰Recipes🟨 设置服饰Recipes属性🟥 项目基础配置 将 UMA_DCS 预制体放到场景中创建空物体,添加DynamicCharacterAvatar 脚本,选择 HumanMaleDCS作为我们的基本模型配置默认Animator 🟧 给UMA配置默认服饰Recipes 服饰Re…

【web开发】5.Mysql及python代码执行数据库操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、MYSQL二、MySQL管理查看已有数据库创建数据库删除数据库进入数据库创建表删除表展示表的行列插入数据查看表中的数据删除数据修改数据 三、python代码执行数据库…

【数据结构与算法系列5】螺旋矩阵II (C++ Python)

给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输入&#xff1a;n 1 输出&am…

4.3.3.1 【MySQL】CHAR(M)列的存储格式

我们知道 Compact 行格式在 CHAR(M) 类型的列中存储数据的时候还挺麻烦&#xff0c;分变长字符集和定长字符集的情况&#xff0c;而在 Redundant 行格式中十分干脆&#xff0c;不管该列使用的字符集是啥&#xff0c;只要是使用 CHAR(M) 类型&#xff0c;占用的真实数据空间就是…

2023年财务顾问行业研究报告

第一章 行业概况 1.1 定义及分类 财务顾问&#xff08;Financial Advisor&#xff0c;FA&#xff09;也被称为融资顾问&#xff0c;主要为创业公司提供投资和融资的专业服务。他们在创业者和投资者之间扮演着至关重要的中介角色&#xff0c;为双方搭建桥梁&#xff0c;确保投…

Python - 队列【queue】task_done()和join()基本使用

一. 前言 task_done()是Python中queue模块提供的方法&#xff0c;用于通知队列管理器&#xff0c;已经处理完了队列中的一个项目。 queue.task_done()是Queue对象的一个方法&#xff0c;它用于通知Queue对象&#xff0c;队列中的某一项已经被处理完毕。通常在使用Queue对象时…

【数据结构】 树和二叉树概念

1.树概念及结构 树概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff0c;…

Android lint配置及使用

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、将 lint 配置为不显示警告3.1 在 A…

Hadoop的第三大组成:YARN框架

Hadoop的第三大组成--YARN框架 一、YARN基本概念二、YARN的基本架构组成1、ResourceManager&#xff1a;YARN集群的管理者2、NodeManager3、Container4、ApplicationMaster 三、YARN的详细工作流程--运行MapReduce四、YARN的资源调度器问题五、YARN的web网站问题 一、YARN基本概…

数字展厅有什么优势,一文了解数字展厅建设方案

引言&#xff1a; 在当今数字化风潮的席卷下&#xff0c;企业们正积极寻求创新的方式来吸引和互动他们的客户。数字展厅作为一种新型的虚拟宣传工具&#xff0c;已经开始引起广泛的关注。 一&#xff0e;什么是数字展厅&#xff1f; 数字展厅是一种基于虚拟现实&#xff08;V…

C++数据结构类的自实现,封装栈,循环队列

my_Queue.h #ifndef MY_QUEUE_H #define MY_QUEUE_Hclass My_Queue { private:int* m_queue; //队列空间指针int front; //队头int tail; //队尾int m_length; //队列长度public://构造函数My_Queue(int len);//构造拷贝函数My_Queue(const My_Queue& obj);//队列长度in…

“构建高效的SpringMVC增删改查应用“

目录 引言1.配置SpringMVCpom.xmlweb.xmlzking.tldgeneratorConfig.xmljdbc.propertieslog4j2.xmlspring-context.xmlspring-mvc.xmlspring-mybatis.xmlStudentBizImplPagerAspectPageTag 2.实现代码功能StudentController 3.JSP页面代码List.jspedit.jspheard.jsp 4. 运行截图…

Linux--进程--进程-父进程退出

1.进程退出函数 进程退出分为正常退出&异常退出 正常退出&#xff1a; 1、main函数调用return 2、进程调用exit(),标准c库 3、进程调用_exit()或者_Exit(),属于系统调用 补充 1、进程最后一个线程返回 2、最后一个线程调用pthread_exit 异常退出&#xff1a; 1、调用abo…

十九、MySQL外键删除更新行为如何实现?

1、行为约束 &#xff08;1&#xff09;基础概念&#xff1a; 要学习外键约束&#xff0c;就要先了解外键约束。 比如说&#xff0c;现在这里有两张表&#xff0c;其中一张存储着用户的信息(子表)&#xff0c;另外一张存储着用户所属的部门(父表) &#xff0c;但现在…

c++的引用和指针

我们要清楚的知道&#xff0c;使用指针和引用都可以的传入函数的main函数的变量在局部函数改变值时&#xff0c;main函数里面相应的变量也会改变值。但他俩的方式不同。 我们先来说指针&#xff0c;指针传入局部参数时&#xff0c;他会在创建个局部指针变量&#xff0c;然后把…

UMA 2 - Unity Multipurpose Avatar☀️一.让UMA角色动起来

文章目录 🟥 项目基础配置1️⃣UMA_DCS 预制体2️⃣创建 UMA 角色🟧 让UMA动起来1️⃣ 新建空场景,添加UMA_DCS预制体2️⃣配置 vBasicController_Template🟥 项目基础配置 1️⃣UMA_DCS 预制体 将 UMA_DCS 预制体放到场景中 2️⃣创建 UMA 角色 创建空物体,添加 Dy…