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

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

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

当然,除了上述介绍的内容外,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() 方法发送邮件,并跳转到完成页面。

相关推荐

别让水 “跑” 出卫生间!下沉设计打造滴水不漏的家

你是否遭遇过卫生间的水“偷偷溜”进客厅,导致木地板鼓起、墙角发霉的糟心事?又是否为卫生间门口反复渗漏,不得不一次次返工维修而头疼不已?在家庭装修中,卫生间防水堪称“兵家必争之地”,而卫生间门口下...

歼-10CE vs 阵风:谁才是空中霸主?全面性能对比解析

歼10CE与法国阵风战斗机性能深度对比分析一、总体定位与设计哲学歼10CE:单发中型多用途战斗机,侧重于空优(制空权争夺)和对地对海打击,具有较高的性价比和较强的多任务能力。法国阵风战斗机:双发中型多...

知名移植工作室肯定Switch2的图形性能,却被CPU拖了后腿

虽然Switch2发售多日,但没入手的玩家对其性能还是有顾虑。近日,知名移植工作室Virtuos的技术总监在接受采访时讨论了Switch2的性能,并给出了他们工作室的评价。简单来说,Switch2在D...

虹科实测 | CAN XL vs CAN FD传输性能深度对比:速率翻倍,抖动锐减!

导读在汽车电子与工业通信领域,CAN协议持续进化,推动着数据传输效率的提升。本次实测基于虹科PCAN-USBXL与虹科PCAN-USBProFD硬件,在同等严苛条件下对比CANXL与CANF...

1J117合金材料优异的耐腐蚀性、机械性能

1J117合金材料概述定义:1J117是一种不锈软磁精密合金,属于铁铬基合金,其圆棒产品具有特定的形状和尺寸,可满足各种工业应用中的特定需求。标准:技术条件标准为GB/T14986,品种规格标准...

据高管所称,Switch2能轻松移植XSS平台60帧游戏

任天堂,作为主机游戏界的御三家之一,一直注重游戏性而不注重更新升级硬件设备是其最大的特点。各位任豚们,忍受着任天堂早已落后硬件设备,真想感叹一句,天下苦任久矣!但Switch2的出现或许正在渐渐的改变...

FJK-110LED-HXJSN磁传感器有哪应用

作为一名从事电子技术相关工作的自媒体人,我经常会遇到各种传感器的应用问题。其中,FJK-110LED-HXJSN磁传感器是一款在工业自动化、智能设备等领域比较常见的磁场检测元件。今天我想和大家聊一聊这...

浅谈欧标方管200x200x5-12mm质S275JRH的优势与劣势

欧标方管200x200x5-12mm材质S275JRH是一种常见的结构用钢材,广泛应用于建筑、机械制造、桥梁、钢结构等领域。本文将对这种方管的优势与劣势进行浅谈,以帮助读者更好地了解其特性和适用场景。...

宽带拨号错误 651 全解析:故障定位与修复方案

在使用PPPoE拨号连接互联网时,错误651提示「调制解调器或其他连接设备报告错误」,通常表明从用户终端到运营商机房的链路中存在异常。以下从硬件、系统、网络三层维度展开排查:一、故障成因分类图...

模型微调:从理论到实践的深度解析

在人工智能领域,模型微调已成为提升模型性能、使其适应特定任务的关键技术。本文将全面系统地介绍模型微调的各个方面,帮助读者深入理解这一重要技术。一、什么是模型微调模型微调是指在已经训练好的预训练模型基础...

汉语拼音 z、c、s图文讲解(拼音字母表zcs教学视频)

以下是汉语拼音z、c、s的图文讲解,结合发音要领、书写规范及教学技巧:一、发音方法与口诀1.z的发音发音要领:舌尖轻抵上齿背,形成阻碍后稍放松,气流从窄缝中挤出,声带不振动(轻短音)。口诀:“写字写...

吴姗儒惹怒刘宇宁粉丝!吴宗宪护航「是综艺梗」叮咛女儿对话曝光

记者孟育民/台北报道Sandy吴姗儒在《小姐不熙娣》因为节目效果,将男星刘宇宁的头像踩在地上,引起粉丝怒火,节目发声明道歉后仍未平息,她也亲自发文郑重道歉:「我对刘宇宁本人完全没有任何恶意,却在综艺表...

苹果错误地发布了macOS Tahoe公开测试版 现已将其撤下

一些Beta测试人员下载了他们以为是macOSSequoia15.6RC的版本,但却错误地下载了macOSTahoe26公开测试版,后来苹果修复了该问题。苹果预计将于7月25...

make的多种用法!(make 的用法总结)

一、make的用法美make[meik]①V.制造;制定,拟定;使变得,使处于;造成,引起;整理(床铺);做,作出;强迫;挑选,任命…②n.(机器、设备等的)品牌,型号;结构,构造;通电,接电⑤[...

北顿尖刀哗变?俄第20近卫集团军损失惨重,拒绝执行指挥官命令?

【军武次位面】作者:太白近日,外国社交媒体“电报”上传出了一些消息,称俄罗斯在北顿涅兹克战场上的“尖刀”部队之一,俄第20近卫集团军因为损失惨重,已经出现了部分部队拒绝执行指挥官命令,甚至哗变的情况。...