django自定义表单

文章目录

  • django自定义表单
    • 两种方式
    • 自定义错误信息
    • widgets
    • 实例化和初始化
    • 处理用户提交的数据
    • 验证表单
    • 通用类试图使用表单
    • Formset

django自定义表单

两种方式

  1. 继承Form
  2. 继承ModelForm
from django import forms
from .models import Contact# 自定义表单字段
class ContactForm1(forms.Form):name = forms.CharField(label="Your Name", max_length=255)email = forms.EmailField(label="Email address")# 根据模型创建
class ContactForm2(forms.ModelForm):class Meta:model = Contact   #指定表单与哪个Django模型相关联fields = ('name', 'email',)  #指定表单应该包含的模型字段

自定义错误信息

from django import formsclass LoginForm(forms.Form):  username = forms.CharField(required=True,max_length=20,min_length=6,error_messages={'required': '用户名不能为空','max_length': '用户名长度不得超过20个字符','min_length': '用户名长度不得少于6个字符',})password = forms.CharField(required=True,max_length=20,min_length=6,error_messages={'required': '密码不能为空','max_length': '密码长度不得超过20个字符','min_length': '密码长度不得少于6个字符',})

widgets

widgets 是表单和模型表单的一个属性,它允许你指定每个表单字段的HTML控件类型,以及它们的大小、样式等细节。

from django import forms
from myapp.models import Authorclass AuthorForm(ModelForm):class Meta:model = Authorfields = ('name', 'title', 'birth_date')widgets = {'name': forms.TextInput(attrs={'cols': 80}),  # 使用 TextInput 并设置合适的宽度'title': forms.TextInput(attrs={'cols': 50}),  # 假设 title 也是单行文本'birth_date': forms.DateInput(attrs={'type': 'date'}),  # 使用 DateInput 来输入日期}labels = {'name': 'Author Name',  # 更具体的标签'title': 'Title',  # 为 title 字段设置标签'birth_date': 'Birth Date',  # 为 birth_date 字段设置标签}help_texts = {'name': 'Enter the author\'s full name.',  # 提供更具体的帮助文本'title': 'Enter the author\'s title, if any.',  # 提供 title 字段的帮助文本'birth_date': 'Enter the author\'s birth date.',  # 提供 birth_date 字段的帮助文本}error_messages = {'name': {'max_length': "The author's name is too long.",  # 自定义错误消息},'title': {'max_length': "The title is too long.",  # 如果 title 字段有最大长度限制,添加自定义错误消息},'birth_date': {'invalid': "Enter a valid birth date.",  # 添加日期无效的错误消息},}

实例化和初始化

在定义完表单类后,要对其进行实例化和初始化。

form = ContactForm()  #空表单

需要给表单设置初始数据,通过initial方法或设置default_data:

# initial方法初始化
form = ContactForm(initial={'name': 'First and Last Name',},)# default_data默认值
default_data = {'name': 'John', 'email': 'someone@hotmail.com', }
form = ContactForm(default_data)

处理用户提交的数据

form = ContactForm(data=request.POST)

表示将使用请求对象 request 中的 POST 字典来填充表单

##给表单提供现有实例对象

在编辑或修改现有对象的场景中,可以使用Django的ModelForm来提供现有对象的数据,而不是渲染一个空表单。

contact = get_object_or_404(Contact, pk=id)  # 获取模型实例
form =  ContactForm(instance = contact, data=request.POST)  # 指定一个已经存在于数据库中的模型实例。当创建表单时,Django 会使用这个实例的当前数据来预填充表单字段。这样,当用户编辑一个对象并提交表单时,表单会显示该对象的当前值,而不是空字段。 

显示一个指定的现有对象的值,用户提交表单后使用请求对象的POST来填充表单。

该方法仅适用于由模型创建的ModelForm,而不适用于自定义的表单。

验证表单

每个forms类可以通过clean方法自定义表单验证。

def clean_username(self):username = self.cleaned_data.get('username')if len(username) < 6:raise forms.ValidationError("Your username must be at least 6 characters long.")elif len(username) > 50:raise forms.ValidationError("Your username is too long.")else:user = User.objects.filter(username__exact=username).first()if user.exists():raise forms.ValidationError("Your username already exists.")

通用类试图使用表单

使用form_class
class View(FormView):model = Articleform_class = ContactFormtemplate_name = ''

Formset

Formset 是一个用于处理一组表单的特殊对象。当你需要在单个页面上显示和处理多个相同类型的表单时,也就是处理表单中的表单时,Formset 非常有用。

而Formset的使用分为四步:

  1. 定义表单类
  2. 创建表单类
  3. 视图中实用表单集
  4. 在模板中渲染表单集

举个例子:

一个在线商店,商店允许顾客创建多个订单,每个订单包含多个商品。可以使用Django的Formset来管理顾客添加到购物车的多个商品。

  1. 定义一个表单来收集顾客对每个商品的选择数量
from django import formsclass ProductForm(forms.Form):quantity = forms.IntegerField(min_value=1, max_value=10, required=False, label='Quantity')
  1. 创建一个Formset来管理顾客添加到购物车的所有商品表单
from django.forms import formset_factoryProductFormSet = formset_factory(ProductForm, extra=0, can_delete=True) 
# extra=0表示初始时不显示额外的商品表单,顾客需要从商品列表中选择。
# can_delete=True允许顾客删除他们不再想要的商品。
  1. 视图函数中,你处理顾客的POST请求,创建Formset实例,并保存顾客选择的商品
 formset = ProductFormSet(request.POST)
  1. 模板中,你需要渲染Formset并显示商品列表供顾客选择
<form method="post">{% csrf_token %}{{ formset.management_form }}{% for form in formset %}{{ form.as_p }}<!-- 显示商品列表和顾客的选择 --><select name="{{ form.product.name }}" id="{{ form.product.id }}"><option value="1">1</option><option value="2">2</option><!-- ...更多商品选项 --></select>{% endfor %}<input type="submit" value="Add to Cart">
</form>

本人也处于学习阶段,若有错误与不足请指出,关注DPT一起进步吧。

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

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

相关文章

_note_06

1.说一说函数的按地址传递和按值传递&#xff0c;他们的区别是什么&#xff1f; 函数的参数传递方式可以分为按地址传递&#xff08;也称为按引用传递&#xff09;和按值传递两种方式。按值传递是指将实际参数的值复制给形式参数&#xff0c;即在函数调用时&#xff0c;实际参数…

探索云原生数据库技术:构建高效可靠的云原生应用

数据库是应用开发中非常重要的组成部分&#xff0c;可以进行数据的存储和管理。随着企业业务向数字化、在线化和智能化的演进过程中&#xff0c;面对指数级递增的海量存储需求和挑战以及业务带来的更多的热点事件、突发流量的挑战&#xff0c;传统的数据库已经很难满足和响应快…

2023年终总结——跌跌撞撞不断修正

目录 一、回顾1.一月&#xff0c;鼓足信心的开始2.二月&#xff0c;焦躁不安3.三月&#xff0c;路还是要一步一步的走4.四月&#xff0c;平平淡淡的前行5.五月&#xff0c;轰轰烈烈的前行6.六月&#xff0c;看事情更底层透彻了7.七月&#xff0c;设计模式升华月8.八月&#xff…

04hive数仓内外部表复杂数据类型与分区分桶

hive内部表和外部表 默认为内部表&#xff0c;外部表的关键字 &#xff1a;external内部表&#xff1a;对应的文件夹就在默认路径下 /user/hive/warehouse/库名.db/外部表&#xff1a;数据文件在哪里都行&#xff0c;无须移动数据 # students.txt 1,Lucy,girl,23 2,Tom,boy,2…

Python实战:Python常用IDE选择

在Python编程的旅程中&#xff0c;选择一个合适的开发环境至关重要。本文将详细介绍三种流行的Python开发环境&#xff1a;PyCharm、VS Code和Jupyter Notebook。我们将探讨它们的特点、安装步骤、基本使用方法&#xff0c;并通过具体的代码示例来展示如何在这些环境中编写和运…

Python中,括号内部的for循环(列表推导式)

在Python中&#xff0c;括号内部的for循环通常用于列表推导式&#xff08;list comprehension&#xff09;&#xff0c;这是一种简洁创建列表的方式。列表推导式可以使用任何可迭代对象内的元素来创建新的列表元素。 列表推导式的基本语法结构如下&#xff1a; [expression f…

Kafka的分区机制

Kafka的分区机制是其核心功能之一&#xff0c;旨在提高可扩展性和并行处理能力。下面概述了Kafka分区的基本概念和工作原理&#xff1a; Kafka分区基本概念 分区&#xff08;Partition&#xff09;&#xff1a;Kafka中的主题&#xff08;Topic&#xff09;可以细分为多个分区…

政安晨:【深度学习处理实践】(五)—— 初识RNN-循环神经网络

RNN&#xff08;循环神经网络&#xff09;是一种在深度学习中常用的神经网络结构&#xff0c;用于处理序列数据。与传统的前馈神经网络不同&#xff0c;RNN通过引入循环连接在网络中保留了历史信息。 RNN中的每个神经元都有一个隐藏状态&#xff0c;它会根据当前输入和前一个时…

Java EE之wait和notify

一.多线程的执行顺序 由于多个线程执行是抢占式执行&#xff0c;就会导致顺序不同&#xff0c;同时就会导致出现问题&#xff0c;就比如俩个线程同时对同一个变量进行修改&#xff0c;我们难以预知执行顺序。 但在实际开发中&#xff0c;我们希望代码按一定的逻辑顺序执行&am…

AI辅助研发:引领科技创新的未来之路

随着人工智能技术的快速发展和广泛应用&#xff0c;AI辅助研发正逐渐成为科技界和工业界的焦点。2024年&#xff0c;作为AI技术进一步成熟的见证者&#xff0c;我们正处于AI辅助研发的黄金时代。从医药研发到汽车设计&#xff0c;从软件开发到材料科学&#xff0c;AI的影响力已…

计算机视觉——P2PNet基于点估计的人群计数原理与C++模型推理

简介 人群计数是计算机视觉领域的一个核心任务&#xff0c;旨在估算静止图像或视频帧中的行人数量。在过去几十年中&#xff0c;研究人员在这个领域投入了大量的精力&#xff0c;并在提高现有主流基准数据集性能方面取得了显著进展。然而&#xff0c;训练卷积神经网络需要大规…

matlab阶段学习笔记小节2

syms定义符号变量 求极限 第二题 第三题 limit(y,n,inf);求的的函数y关于自变量n在无穷处&#xff08;inf&#xff09;的极限 exp(2)即指数为2&#xff0c;底为e,也就是e^2 求导数 第一题 log(x)默认是以e为底的指数函数&#xff0c;也就是ln(x). 使用diff(f)对函数进行求…

今日份总结

1&#xff1a;标题 <h1>一级标题</h1> <h2>二级标题</h2> <h3>三级标题</h3> 可以用快捷键&#xff1a;h$*6 (表示一到六级标题) 2&#xff1a;段落 <p>这是一个段落</p> 3&#xff1a;换行 <p>这是一个段落&l…

算法-双指针、BFS与图论-1113. 红与黑

题目 思路 本题相当于问BFS中的当前点所在的区域连通块有多少个 Flood Fill算法 &#xff08;可参考以下链接&#xff1a;洪水覆盖算法(Flood Fill)&#xff1a;颜色填充-CSDN博客&#xff09;本题用DFS实现Flood Fill算法DFS是否需要恢复现场&#xff1a;&#xff08;重要&am…

新IDEA电脑环境设置

1.设置UTF-8 2.Maven 3.JRE选对

【漏洞复现】华三用户自助服务产品dynamiccontent.properties.xhtml接口处存在RCE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

VUE+HBuilder的uniapp技术路线开发应用使用总结

使用总结 本来想做一个记录日常数据的应用&#xff0c;主要在Android端使用&#xff0c;后来发现在uniapp中使用sqllite数据库不是像原生中那样简单(所以当前准备去进行另一个路线&#xff0c;就是给我使用的电脑都安装一个portalble的服务端&#xff0c;用来记录数据&#xf…

java中使用rabbitmq

文章目录 前言一、引入和配置1.引入2.配置 二、使用1.队列2.发布/订阅2.1 fanout(广播)2.2 direct(Routing/路由)2.3 Topics(主题)2.4 Headers 总结 前言 mq常用于业务解耦、流量削峰和异步通信,rabbitmq是使用范围较广,比较稳定的一款开源产品,接下来我们使用springboot的sta…

C#(C Sharp)学习笔记_变量常量与作用域【十二】

变量 变量是用来存储数据值的标识符。你可以将变量视为内存中的一个位置&#xff0c;这个位置可以保存不同类型的数据。同时&#xff0c;变量也被称作为类中的成员变量 在C#中声明变量时&#xff0c;你需要指定变量的类型&#xff0c;这告诉编译器你打算在变量中存储什么类型的…

角蜥优化算法 (Horned Lizard Optimization Algorithm ,HLOA)求解无人机路径优化

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化飞行时间和节省能量消耗。 二、算法介…