Django ModelForm 组件的应用
ModelForm组件的应用
ModelForm 组件的创建:
1.创建一个类,该类继承 forms.ModelForm
2.大致组成部分
class ModelNameModelForm(forms.ModelForm):
class Meta:
model =需要校正的模型类名
例:model = models.Book
fields=" __all__" 或 fields=["字段名”,........] 选择需要展示或校正的字段
error_messages={
"字段名”:{“required”: "此字段不能为空”},
"字段名”:{“required”: "此字段不能为空”},
.........
}
from django.forms import widgets as wid
widgets={
"字段名":wid.TextInput(attrs={"input标签属性":"属性值"}),
"price":wid.TextInput(attrs={"class":"form-control"}),
"pub_date":wid.DateInput(attrs={"class":"form-control","type":"date"}),
}
labels={
"字段名”:“别名”,
“title” :“书籍名称”,
}
#钩子,进一步校正函数
def clean_字段名(self):
val = self.cleaned_data.get("字段名”)
if 符合条件:
return val
else:
raise ValidationError("想要说明的错误信息”)
3.应用
用的时候只需要 :
form = ModelNameModelForm(需要校正的数据字典)
例:
1.直接展示空的input的标签(get请求时)
form = BookModelForm( ) #直接展示,渲染出空内容的input 标签
# form = BookModelForm(instance=edit_book) 编辑情况下
2.用户提交数据,需校正时,可以展示错误的提示信息 (post请求时)
form = BookModelForm(request.POST ) #校正前端通过post请求的提交的数据
##form = BookModelForm(request.POST,instance=edit_book) 编辑情况下
if form.is_vaild():
form.save()
redirect("/book/")
else:
return render(request, 'addbook.html', locals())
实例
1.model .py :(模型类 Book为例)
from django.db import models# Create your models here. from django.db import models# Create your models here. class Book(models.Model):title = models.CharField( max_length=32,verbose_name="书籍名称")pub_date=models.DateField(verbose_name="出版日期")price=models.DecimalField(max_digits=5,decimal_places=2,verbose_name="价格")publish=models.ForeignKey(to="Publish",to_field="id",on_delete=models.CASCADE,null=True,verbose_name="出版社")authors=models.ManyToManyField("Author",db_table="book2authors",verbose_name="作者") # 创建关系表def __str__(self):return self.titleclass Meta:verbose_name="书籍"
2.views.py(构建ModelForm组件)
form django import forms
from django.forms import widgets as wid
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
class BookModelForm(forms.ModelForm):class Meta:model = models.Bookfields="__all__" #默认页面渲染时 显示所有的字段# fields=["title","price"] #需要显示的字段 #错误信息error_messages={"title":{"required":"书名不能为空"},"price":{"required":"价格不能为空"},"pub_date":{"required":"日期不能为空"},"publish":{"required":"出版社不能为空"},"authors":{"required":"作者不能为空"},} #给渲染的input标签设置type类型和相关的属性 widgets={"title":wid.TextInput(attrs={"class":"form-control"}),"price":wid.TextInput(attrs={"class":"form-control"}),"pub_date":wid.DateInput(attrs={"class":"form-control","type":"date"}),} #字段别名设置labels={"title":"书籍名称", }#钩子函数,进一步进行约束 #对title字段进行约束def clean_title(self):val=self.cleaned_data.get("title")if val.isdigit():raise ValidationError("书名不能为纯数字!")else:return val #对price字段进行约束 def clean_price(self): val=self.cleaned_data.get("price") if val.isdigit(): return val else: raise ValidationError("价格必须为数字")
3.views.py视图函数中:
后端添加视图函数:用ModelForm组件实现页面渲染 (红色字体部分)
def addbook(request):if request.method=="POST":'''data=request.POST.dict()data.pop("csrfmiddlewaretoken")data.pop("author_list")book=models.Book.objects.create(**data) # 保证提交键值对的键必须和数据库表字段一致# 为书籍绑定作者关系author_list=request.POST.getlist("author_list")print(author_list) # ['1', '2']book.authors.add(*author_list)'''form=BookModelForm(request.POST)if form.is_valid():form.save()return redirect("/books/")else:return render(request, 'addbook.html', locals())else:# form=BookForm() # forms组件form=BookModelForm() # modelforms组件return render(request,'addbook.html',locals())
前端添加页面:
<div class="container-fluid"><div class="row"><div class="col-md-6 col-md-offset-3"><h3>添加{{ table_name }}</h3><form action="" method="post" novalidate>{% csrf_token %}{% for field in form %}<div><label for="">{{ field.label }}</label>{{ field }}<span class="error pull-right">{{ field.errors.0 }}</span></div>{% endfor %}<input type="submit" class="btn btn-primary"></form></div></div> </div>
后端编辑视图:
def editbook(request,edit_book_id):edit_book = models.Book.objects.filter(pk=edit_book_id).first()if request.method=="POST":# 方式1:# title=request.POST.get("title")# price=request.POST.get("price")# pub_date=request.POST.get("pub_date")# publish_id=request.POST.get("publish_id")# author_list=request.POST.getlist("author_list")# models.Book.objects.filter(pk=edit_book_id).update(title=title,price=price,pub_date=pub_date,publish_id=publish_id) # update只有queryset才能调用# edit_book.authors.set(author_list)# 方式2:# data=request.POST.dict()# data.pop("csrfmiddlewaretoken")# author_list=data.pop("author_list")# models.Book.objects.filter(pk=edit_book_id).update(**data) # 保证提交键值对的键必须和数据库表字段一致# # 为书籍绑定作者关系# author_list=request.POST.getlist("author_list")# edit_book.authors.set(author_list)# 方式3form = BookModelForm(request.POST,instance=edit_book)#编辑时,instance=edit_book 传进去就可以该对象信息在页面的展示,这是编辑和添加页面的区别之处if form.is_valid():,form.save()return redirect("/books/")else:return render(request, 'editbook.html', locals())else:form=BookModelForm(instance=edit_book)return render(request,'editbook.html',locals())
前端编辑页面渲染代码:
<div class="container-fluid"><div class="row"><div class="col-md-6 col-md-offset-3"><h3>编辑{{ table_name }}</h3><form action="" method="post" novalidate>{% csrf_token %}{% for field in form %}<div><label for="">{{ field.label }}</label>{{ field }}<span class="error pull-right">{{ field.errors.0 }}</span></div>{% endfor %}<input type="submit" class="btn btn-primary"></form></div></div> </div>
转载于:https://www.cnblogs.com/knighterrant/p/10279659.html
Django ModelForm 组件的应用相关推荐
- Django Form和ModelForm组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django ModelForm操作及验证
一.内容回顾 Model- 数据库操作- 验证class A(MOdel): user = email = pwd = Form - class LoginForm(Form): email = fi ...
- 一篇文章浅析Django Form组件相关知识
击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 灭烛怜光满,披衣觉露滋. 前言 在上 ...
- 路飞学城python全栈开发_python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)...
昨日内容回顾 1. 为什么要做前后端分离?-前后端交给不同的人来编写,职责划分明确.-API (IOS,安卓,PC,微信小程序...)-vue.js等框架编写前端时,会比之前写jQuery更简单快捷. ...
- markdownpad2 html渲染组件出错_Day68 Django forms组件
目录 forms组件 forms组件类书写 forms组件如何校验数据 forms组件如何渲染标签 forms组件展示错误信息 forms组件钩子函数(HOOK) forms组件常见参数 forms组 ...
- Django contenttypes组件
Django包含一个contenttypes应用程序(app),可以跟踪Django项目中安装的所有模型(Model),提供用于处理模型的高级通用接口. 生成表结构之后有一个表,包含所有其他表 该组件 ...
- Django 分页组件替换自定义分页
Django的分页器(paginator) 总之不太好用我们还是用自己的好一些 自定义分页器 分页实现源码 """ 自定义分页组件 """c ...
- Django admin组件源码流程
admin 组件 Django 自带的用户后台组件 用于用户便携的操作 admin 组件核心 启动 注册 设计url 启动核心代码 每个app 通过 apps.py 扫描 admin.py 文件 并执 ...
- Django——stark组件
stark组件是仿照django的admin模块开发的一套组件,它的作用是在网页上对注册的数据表进行增删改查操作. 一.配置 1.创建stark应用,在settings.py中注册stark应用 st ...
最新文章
- RichTextBox实现关键字自定义颜色显示(C#)
- python selenium模块使用出错解决,Message: 'geckodriver' executable needs to be in PATH
- htc资料和js和css的嵌套
- 如何扩大缓存区_艾莱依首个自动化仓落地,库宝解决线边缓存难题
- Mysql面试常见知识点总结(一)
- 微信灰度测试“相关阅读”功能 公众号文章下推荐延伸内容
- WebLogic UniversalExtractor反序列化漏洞(CVE-2020-14645)的复现和分析
- 【科研论文】某雷达自动测试系统研制–基于全硬件TCP/IP协议栈芯片W5300
- 同学,那些个证书没屌用!
- Windows server 2003 伪静态配置方法
- Listary 高效启动器(win)
- c语言标准流程图,c语言设计流程图!设计流程图
- 连接同一局域网的打印机
- 网页的缩放,适配以及移动的适配!
- 提高组CSP-S初赛模拟试题整理
- [转帖]同事推荐的的aira2
- Composer安装Laravel最简单、详细图解
- 「微服务架构」亚马逊引领其自有微服务架构的原因
- oracle 视图能建索引吗,Oracle视图中建立索引注意事项.doc
- linux指令英文含义,Linux —— 常见指令及其英文全称
热门文章
- int 类型的取值范围
- KVO 从基本使用到原理剖析
- 快速排序算法图解分析
- c语言蓝桥十进制转十六进制,蓝桥杯 基础练习 十进制转十六进制
- 权限管理系统中 管理员能看到所有用户的密码么_计算机毕设项目002之学生成绩管理系统...
- 6种常见的无线组网架构
- 应用存储和持久化数据卷:核心知识
- 授予数据库账号dba权限_从自建Oracle迁移至云原生数据仓库AnalyticDB PostgreSQL
- Postman响应断言
- hive 指定字段插入数据_Hive 表之间数据处理,Int 类型字段部分字段出现 NULL情况...