当前位置: 首页 > news >正文

Django ModelForm用法详解 —— Python

Django ModelForm是一种自动生成表单的工具,它是以模型为基础,在模型类上定义的表单。在使用Django ModelForm时,我们只需要指定模型类作为表单数据的基础,就可以自动地生成表单。下面是Django ModelForm用法的完整攻略。

创建ModelForm

首先,我们需要定义一个ModelForm。在创建ModelForm时,需要通过指定Meta类来定义ModelForm的一些元信息,如所使用的model、fields等,如下所示:

​from django import forms
from myapp.models import MyModelclass MyModelForm(forms.ModelForm):class Meta:model = MyModelfields = ['field1', 'field2', 'field3']​

在上面的代码中,我们创建了一个名为MyModelForm的ModelForm,并定义了它的Meta类。该类指定了所使用的模型为MyModel,并明确了要使用的字段。

使用ModelForm渲染表单

在视图中,我们可以通过以下方式使用ModelForm来渲染一个表单:

​def my_view(request):# 如果通过 POST 方法提交表单数据if request.method == 'POST':form = MyModelForm(request.POST)if form.is_valid():# 表单合法,则处理提交的数据form.save()return HttpResponseRedirect('/thanks/')# 如果不是 POST 方法提交,则创建一个空白的表单else:form = MyModelForm()return render(request, 'my_template.html', {'form': form})​

在上面的代码中,我们尝试从请求中获取表单数据,如果发现表单的数据是有效的,那么就对其进行处理,否则就显示错误信息。如果请求类型不是POST,则直接生成一个空白的表单。

在模板中渲染表单

在上面的视图中,我们在调用render函数时向模板中传入了表单:{'form': form}。我们可以在模板中通过简单地调用表单的as_p()、as_table()或as_ul()方法来将表单渲染为HTML,如下所示:

​<form method="POST">{% csrf_token %}{{ form.as_p }}<button type="submit">Save</button>
</form>​

 在上面的HTML代码中,我们使用了form.as_p方法,将表单渲染成一个段落列表(即

标签)。

自定义表单的元素

除了自动生成表单外,Django ModelForm还允许我们向表单中添加自定义元素。我们可以在ModelForm的init()方法中添加自定义的字段,如下所示:

​from django import forms
from myapp.models import MyModelclass MyModelForm(forms.ModelForm):my_field = forms.CharField(max_length=100, required=False)class Meta:model = MyModelfields = ['field1', 'field2', 'field3']def __init__(self, *args, **kwargs):super(MyModelForm, self).__init__(*args, **kwargs)self.fields['my_field'].label = "My field label"​

 在上面的代码中,我们向表单添加了一个自定义的字段my_field,它是一个CharField类型。在模板中,我们可以像处理其他字段那样,通过{{ form.my_field }}来使用自定义的字段。

自定义表单的验证

Django ModelForm还允许我们自定义表单的验证。我们可以通过覆盖ModelForm的clean()方法来实现自定义验证,如下所示:

​from django import forms
from myapp.models import MyModelclass MyModelForm(forms.ModelForm):class Meta:model = MyModelfields = ['field1', 'field2', 'field3']def clean(self):cleaned_data = super().clean()field1 = cleaned_data.get("field1")field2 = cleaned_data.get("field2")if field1 and field2:if field1 > field2:raise forms.ValidationError("Field1 cannot be greater than Field2")​

 在上面的代码中,我们重写了ModelForm的clean()方法,并在其中定义了自定义验证逻辑,用于验证是否满足特定的条件。在这个例子中,我们验证了field1是否大于field2。

定义自定义的表单格式

最后,我们可以用widget属性自定义Django ModelForm的实例,来对表单进行格式化和样式的修改。例如我们可以添加一个自定义的style,如下所示:

​from django import forms
from myapp.models import MyModelclass MyModelForm(forms.ModelForm):class Meta:model = MyModelfields = ['field1', 'field2', 'field3']widgets = {'field1': forms.TextInput(attrs={'class': 'my-class'}),    'field2': forms.TextInput(attrs={'class': 'my-class','style': 'color: red;'    }),    }​

 在上面的代码中,我们使用widget属性添加了自定义的样式,其中field1使用系统class "my-class"来定义样式;而field2则同时使用系统class和额外的自定义style,以达到自己所期望的效果。

总结

到这里,我们已经简单了解了Django ModelForm的用法,它可以自动生成表单,并允许我们对表单进行自定义,以满足我们的需求。但是需要注意,对于较复杂的表单,可能需要使用Django Forms或者自定义表单。

本次分享到此结束,觉得有所帮助的朋友点点关注点点赞!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Redis 7.x 系列【21】主从复制
  • Elasticsearch详细介绍
  • 数据库第五次作业---多表查询
  • Linux grep技巧 结合awk查询
  • 阶段三:项目开发---搭建项目前后端系统基础架构:任务11:搭建项目后台系统基础架构
  • 利用node连接mongodb实现一个小型后端服务系统demo
  • LabVIEW中使用 DAQmx Connect Terminals作用意义
  • 【深度学习】图形模型基础(5):线性回归模型第四部分:预测与贝叶斯推断
  • 即插即用篇 | YOLOv5/v7引入Haar小波下采样 | 一种简单而有效的语义分割下采样模块
  • 精准注入:掌握Conda包依赖注入的艺术
  • Python不使用元类的ORM实现
  • 开源数字人项目Hallo
  • hutool ExcelUtil 导出导入excel
  • 微服务节流阀:Eureka中服务限流策略的精妙实现
  • Knife4j的原理及应用详解(四)
  • [译]CSS 居中(Center)方法大合集
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • ES6简单总结(搭配简单的讲解和小案例)
  • gf框架之分页模块(五) - 自定义分页
  • If…else
  • isset在php5.6-和php7.0+的一些差异
  • Koa2 之文件上传下载
  • learning koa2.x
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • node学习系列之简单文件上传
  • spring boot 整合mybatis 无法输出sql的问题
  • vue自定义指令实现v-tap插件
  • 当SetTimeout遇到了字符串
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 解析 Webpack中import、require、按需加载的执行过程
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 使用API自动生成工具优化前端工作流
  • 阿里云服务器如何修改远程端口?
  • 带你开发类似Pokemon Go的AR游戏
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​用户画像从0到100的构建思路
  • # SpringBoot 如何让指定的Bean先加载
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (bean配置类的注解开发)学习Spring的第十三天
  • (Java)【深基9.例1】选举学生会
  • (Java入门)学生管理系统
  • (Java数据结构)ArrayList
  • (js)循环条件满足时终止循环
  • (备忘)Java Map 遍历
  • (二)原生js案例之数码时钟计时
  • (分布式缓存)Redis持久化
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务