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

这篇具有很好参考价值的文章主要介绍了Django Form实现表单使用及应用场景。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

这个添加页面就使用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

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

表字段和记录内容如下:

Django Form实现表单使用及应用场景,# Django,django,python,后端

单曲表及表模型

在子应用的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='请选择歌手'
    )

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

表字段和记录内容如下:

Django Form实现表单使用及应用场景,# Django,django,python,后端

演示表单使用

传统的表单生成方式是在模板文件中编写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>

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

效果:

浏览器访问,展示表单。

Django Form实现表单使用及应用场景,# Django,django,python,后端

表单使用进阶

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

优化表单类

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

自定义必填提示语内容。

内容如下:

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 Form实现表单使用及应用场景,# Django,django,python,后端

验证通过:

Django Form实现表单使用及应用场景,# Django,django,python,后端

 

总结

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

到了这里,关于Django Form实现表单使用及应用场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用Django的Form组件

    目录 一、Django Form组件简介 二、创建表单 三、渲染表单 四、处理表单提交 五、自定义表单验证 六、总结 在Web开发中,表单是不可或缺的一部分。它们允许用户输入数据并与服务器进行交互。在Django框架中,表单的处理变得相对简单和直观。Django自带了一个强大的表单处理

    2024年01月18日
    浏览(79)
  • Django学习笔记-表单(forms)的使用

    在Django中提供了了form表单,可以更为简单的创建表单模板信息,简化html的表单。 表单通常用来作为提交数据时候使用。 在项目文件夹下创建一个template文件夹,用于存储所有的html模板文件。 填写项目的相对路径即可。 在app中views.py文件中添加响应函数: 在urls.py添加路由设

    2024年02月15日
    浏览(35)
  • Python web实战 | 使用 Django 搭建 Web 应用程序 【干货】

    从社交媒体到在线购物,从在线银行到在线医疗, Web 应用程序为人们提供了方便快捷的服务。 Web 应用程序已经成为了人们日常生活中不可或缺的一部分。搭建一个高效、稳定、易用的 Web 应用程序并不是一件容易的事情。本文将介绍如何使用 Django 快速搭建一个强大的 Web

    2024年02月15日
    浏览(35)
  • Django实现用户注册登录,表单提交后跳转网页(学习笔记)

    效果图如下:   使用命令提示符,进入想存放项目的目录: 在项目coco目录下新建static文件夹,用于存放网页文件的css,js,imgs 在coco_app目录下新建文件夹templates,用于存放需要用到的HTML网页 打开coco文件夹中的settings.py注册coco_app 引用templates 连接数据库,这里我用的MySQL数据

    2023年04月11日
    浏览(68)
  • Python Django 模型概述与应用

    今天来为大家介绍 Django 框架的模型部分,模型是真实数据的简单明确的描述,它包含了储存的数据所必要的字段和行为,Django 遵循 DRY Principle 。它的目标是你只需要定义数据模型,然后其它的杂七杂八代码你都不用关心,它们会自动从模型生成。 Django 中模型是真实数据的

    2024年02月12日
    浏览(26)
  • python在Django中,如何使用MySQL数据库进行分页怎么实现

    在Django中,使用MySQL数据库进行分页是一个相对简单的任务。Django的ORM提供了内置的分页功能,你只需要使用Paginator类即可。以下是一个基本的示例,展示了如何在Django中使用MySQL进行分页: 首先,确保你已经安装了Django和MySQL,并且已经配置了Django项目以使用MySQL数据库。

    2024年04月29日
    浏览(35)
  • 【Django入门系列】表单处理

    在本章中,我们将学习如何在Django中处理表单数据。表单是Web应用程序中常见的用户交互组件,Django提供了便捷的方式来创建、验证和处理表单数据。 在Django中,我们可以使用表单类来定义和渲染表单。表单类是从forms.Form类或forms.ModelForm类派生的。 以下是一个示例的表单类

    2024年02月12日
    浏览(34)
  • Django(9)-表单处理

    django支持使用类创建表单实例 polls/forms.py 这个类创建了一个属性,定义了一个文本域,和它的label和最大长度。 polls/views.py 在视图函数中定义name函数,创建了一个空的NameForm实例,并将这个form实例渲染给模板的form字段 在模板中可以直接使用双引号引用这个form,而不需要再

    2024年02月10日
    浏览(27)
  • django表单

    表单 form.../form 可以收集其内部标签中的用户输入,然后将数据发送到服务端。 一个HTML表单必须指定两样东西: 目的地:用户数据发送的目的URL 方式:发送数据所使用的HTTP方法 以最简单的GET-POST请求为例: views.py search_from.html search_post.html urls.py 在search_form.html 中action=“/

    2024年02月05日
    浏览(64)
  • 基于Django的Python应用——学习笔记

    环境:Python3.11           Django5.0.1 为项目新建一个目录,将其命名为 learning_log ,再在终端中切换到这个目录,并创建一个虚拟环境。 项目列表生成了这样的一个文件夹 控制台前方出现高亮即为成功 在依然处于活动的虚拟环境的情况下( ll_env 包含在括号内),执行如下命

    2024年02月21日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包