百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

django框架的表单form的理解和用法-1

myzbx 2024-12-22 19:43 14 浏览

当然,除了上述介绍的内容外,Django 的表单系统还有许多其它功能和技巧。以下是一些值得注意的事项:

  1. CSRF 保护

在 Django 中,默认启用 CSRF 保护机制,以防止跨站请求伪造攻击。当使用 POST 方法提交表单时,Django 会自动生成一个随机的 CSRF 标记,该标记必须与表单数据一起提交才能被接受。要在表单中添加 CSRF 标记,可以使用 {% csrf_token %} 模板标签。

<form method="post">
    {% csrf_token %}
    <!-- 表单字段 -->
</form>
  1. 验证错误信息

在表单验证失败时,Django 会将错误信息存储在表单对象的 errors 属性中,并使用模板标签 {% for error in form.field.errors %} 来逐个显示错误信息。如果想要显示所有错误信息,可以使用 {% for error in form.non_field_errors %}。

  1. 自定义错误信息

如果需要自定义验证器的错误信息,则可以在表单类中设置相应的 error_messages 字典。例如,我们可以在联系表单中添加自定义错误信息。

from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100, error_messages={
        'required': 'Please enter a subject.'
    })
    message = forms.CharField(error_messages={
        'required': 'Please enter a message.'
    })
    sender = forms.EmailField(error_messages={
        'required': 'Please enter a valid email address.'
    })

在上述示例中,我们使用 error_messages 属性为每个字段自定义了错误信息。这些错误信息将覆盖默认的错误信息。

除了上述介绍的基本用法和高级功能外,Django 的表单系统还有一些其它特性需要注意。

  1. 带初始值的表单

在 Django 表单系统中,可以通过 initial 属性为表单字段提供初始值。例如,我们可以在联系表单中添加默认主题和发送者。

from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100, initial='A default subject')
    message = forms.CharField(initial='A default message')
    sender = forms.EmailField(initial='example@example.com')
    cc_myself = forms.BooleanField(required=False)

在上述示例中,我们使用 initial 属性为 subject、message 和 sender 字段提供了默认值。这些值将在表单初始化时显示在相应的文本框或复选框中。

  1. 额外的数据

在处理表单数据时,有时需要额外的数据来辅助处理。Django 的表单系统提供了 extra_data 属性来存储这些数据。例如,我们可以在联系表单中添加一个附件上传字段,并将上传的文件保存到服务器上。

from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField(widget=forms.Textarea)
    sender = forms.EmailField()
    cc_myself = forms.BooleanField(required=False)
    attachment = forms.FileField(required=False)

    extra_data = {}

    def handle_attachment(self):
        if 'attachment' in self.files:
            file = self.files['attachment']
            filename = file.name
            content = file.read()
            self.extra_data['attachment_content'] = content
            self.extra_data['attachment_filename'] = filename

    def clean(self):
        self.handle_attachment()
        return super().clean()

在上述示例中,我们定义了一个名为 attachment 的文件上传字段,并使用 extra_data 属性存储上传的文件内容和文件名。然后,在 clean() 方法中调用 handle_attachment() 方法来处理上传的文件,并将结果存储到 extra_data 属性中。

  1. 表单分页

如果一个表单包含大量的字段或数据,可以将其分成多个页面进行填写,以提高用户的体验。Django 的表单系统提供了 FormWizard 类来实现表单分页。例如,我们可以将联系表单分成两个页面。

from django import forms
from django.core.files.uploadedfile import InMemoryUploadedFile
from io import BytesIO
from wizard.forms import ContactFormStep1, ContactFormStep2
from wizard.models import Contact

class ContactFormWizard(SessionWizardView):
    template_name = 'wizard/contact_form.html'

    form_list = [
        ('step1', ContactFormStep1),
        ('step2', ContactFormStep2)
    ]

    def done(self, form_list, **kwargs):
        # 记录联系信息并发送邮件
        contact = Contact.objects.create(
            subject=form_list[0].cleaned_data['subject'],
            message=form_list[1].cleaned_data['message'],
            sender=form_list[2].cleaned_data['sender']
        )

        if 'attachment' in form_list[1].files:
            file = form_list[1].files['attachment']
            filename = file.name
            content = file.read()
            attachment = InMemoryUploadedFile(
                BytesIO(content),
                None,
                filename,
                'application/octet-stream',
                len(content),
                None
            )
            contact.attachment.save(filename, attachment)

        contact.send_email()
        return render(self.request, 'wizard/done.html')

在上述示例中,我们定义了一个名为 ContactFormWizard 的表单向导,并指定了两个表单步骤。在处理完最后一个步骤的数据后,我们创建了一个名为 Contact 的模型实例,并将表单数据存储到该实例中。然后,如果有附件上传,我们将其保存到服务器并记录在模型实例中。最后,我们调用模型实例的 send_email() 方法发送邮件,并跳转到完成页面。

相关推荐

以文本的方式绘制简单的SVG流程图——flowchart.js

介绍flowchart.js是在浏览器和终端中运行的流程图DSL和SVG渲染。节点和连接是分别定义的,因此可以重复使用节点,并可以快速更改连接。也可以在DSL中对节点和连接器样式进行细微的更改。Git...

全国首套构网型SVG在木垒投运

中新网新疆新闻1月5日电(翟文辉)12月29日,全国首套构网型SVG在新疆木垒华电220千伏四十个井子汇集站并网,本项目是新疆电网继阿克陶构网型储能后又一次构网型支撑项目示范。为全面响应国家“双碳”...

Popmotion – 小巧,灵活的 JS 运动引擎

Popmotion是一个只有12KB的JavaScript运动引擎,可以用来实现动画,物理效果和输入跟踪。原生的DOM支持:CSS,SVG,SVG路径和DOM属性的支持,开箱即用。Popmoti...

零基础教你学前端——43、初识SVG

解决网站图标问题的最佳方案——SVG!SVG是一种基于XML语法的图像格式,英文全称是:ScalableVectorGraphics,即可缩放矢量图,是W3C的一项建议。我们用手机拍摄...

2.3 文件格式全解:PSD/JPG/PNG/SVG/GIF

2.3文件格式全解:PSD/JPG/PNG/SVG/GIF一、文件格式的核心意义文件格式是数字图像的存储规则,决定了:-信息保留程度(图层/透明度/动画)-压缩方式与画质损失-跨平台兼容性-...

vite v6.3.2 发布!HMR 优化+CSS 增强+稳定性提升,前端开发再提速!

前言:Vite6.3.2来了!2025年4月18日,Vite团队正式发布了v6.3.2版本!虽然是一个小版本更新,但修复了多个关键问题,并带来了性能优化和稳定性提升,让开发体验更丝滑!如果你还...

一篇文章带你了解SVG 蒙版(Mask)

SVG蒙版功能可将蒙版应用于SVG形状。蒙版可确定SVG形状的哪些部分可见,以及具有什么透明度。运行效果可以将SVG蒙版视为剪切路径的更高级版本。一、简单的蒙版代码解析:本示例使用ID=mask1定义...

SVG实现的流程图绘制

一、项目简介使用SVG技术实现的流程图绘制二、实现功能流程图块生成、连线、拖拽产生相应的xml和xpdl导入导出json数据放大缩小功能保存操作(选择、自动插入、开始结束、普通活动、子活动、块活动、路...

解锁国内 404 页面:Next.js 设置指南和 33 个有趣 SVG 资源分享

前言当我们访问网站时,如果访问到不存在的路径时,会出现404错误。为了避免给访问者带来不良体验,设计网站时通常会在页面上展示“404页面不存在”的提示,并引导用户进行返回首页等操作。因此在建立网...

交互设计师做好动画后,提交给开发的文档有哪些?

谢邀!简单的说一下自己的看法。首先从制作动画开始。目前制作动画的方式主要有:Gif动画视频动画Web动画,而Web动画又包括:CSS动画、JS动画(Canvas动画、原生JS动画API)、SVG动画等...

Motion for Vue:为Vue量身定制的强大动画库

在前端开发中,动画效果是提升用户体验的重要手段。Vue生态系统中虽然有许多动画库,但真正能做到高性能、易用且功能丰富的并不多。今天,我们要介绍的是MotionforVue(motion-v),...

Web开发人员的福音!8个实用的SVG工具

SVG可缩放矢量图形(ScalableVectorGraphics)是基于可扩展标记语言(XML),用于描述二维矢量图形的一种图形格式。SVG是W3C在2000年8月制定的一种新的二维矢量图形格式...

一键画波浪线、一键多图片调色?这3个网站好玩到停不下来

作为一个经常收集网站的PPT设计师,无意中发现了一些超级有趣的网站。只要你动手能力足够强,就一定会利用它做出创意作品。不说废话,直接进入主题。1、炫酷的光线绘画网站http://weavesilk.c...

vite 6.2.5 更新速递:告别SVG路径Bug,构建效率再提升!

Vite6.2.5更新公告2025年4月3日,Vite团队正式发布了Vite6.2.5版本!此次更新虽然是一个小版本迭代,但修复了一个关键问题,涉及SVG文件路径检查,对前端开发者尤...

DrawSVG – SVG 路径动画 jQuery 插件

jQueryDrawSVG使用了jQuery内置的动画引擎实现SVG路径动画,用到了stroke-dasharray和stroke-dashoffset属性。DrawSVG是完全...