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 组件的应用相关推荐

  1. Django Form和ModelForm组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  2. Django ModelForm操作及验证

    一.内容回顾 Model- 数据库操作- 验证class A(MOdel): user = email = pwd = Form - class LoginForm(Form): email = fi ...

  3. 一篇文章浅析Django Form组件相关知识

    击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 灭烛怜光满,披衣觉露滋. 前言 在上 ...

  4. 路飞学城python全栈开发_python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)...

    昨日内容回顾 1. 为什么要做前后端分离?-前后端交给不同的人来编写,职责划分明确.-API (IOS,安卓,PC,微信小程序...)-vue.js等框架编写前端时,会比之前写jQuery更简单快捷. ...

  5. markdownpad2 html渲染组件出错_Day68 Django forms组件

    目录 forms组件 forms组件类书写 forms组件如何校验数据 forms组件如何渲染标签 forms组件展示错误信息 forms组件钩子函数(HOOK) forms组件常见参数 forms组 ...

  6. Django contenttypes组件

    Django包含一个contenttypes应用程序(app),可以跟踪Django项目中安装的所有模型(Model),提供用于处理模型的高级通用接口. 生成表结构之后有一个表,包含所有其他表 该组件 ...

  7. Django 分页组件替换自定义分页

    Django的分页器(paginator) 总之不太好用我们还是用自己的好一些 自定义分页器 分页实现源码 """ 自定义分页组件 """c ...

  8. Django admin组件源码流程

    admin 组件 Django 自带的用户后台组件 用于用户便携的操作 admin 组件核心 启动 注册 设计url 启动核心代码 每个app 通过 apps.py 扫描 admin.py 文件 并执 ...

  9. Django——stark组件

    stark组件是仿照django的admin模块开发的一套组件,它的作用是在网页上对注册的数据表进行增删改查操作. 一.配置 1.创建stark应用,在settings.py中注册stark应用 st ...

最新文章

  1. RichTextBox实现关键字自定义颜色显示(C#)
  2. python selenium模块使用出错解决,Message: 'geckodriver' executable needs to be in PATH
  3. htc资料和js和css的嵌套
  4. 如何扩大缓存区_艾莱依首个自动化仓落地,库宝解决线边缓存难题
  5. Mysql面试常见知识点总结(一)
  6. 微信灰度测试“相关阅读”功能 公众号文章下推荐延伸内容
  7. WebLogic UniversalExtractor反序列化漏洞(CVE-2020-14645)的复现和分析
  8. 【科研论文】某雷达自动测试系统研制–基于全硬件TCP/IP协议栈芯片W5300
  9. 同学,那些个证书没屌用!
  10. Windows server 2003 伪静态配置方法
  11. Listary 高效启动器(win)
  12. c语言标准流程图,c语言设计流程图!设计流程图
  13. 连接同一局域网的打印机
  14. 网页的缩放,适配以及移动的适配!
  15. 提高组CSP-S初赛模拟试题整理
  16. [转帖]同事推荐的的aira2
  17. Composer安装Laravel最简单、详细图解
  18. 「微服务架构」亚马逊引领其自有微服务架构的原因
  19. oracle 视图能建索引吗,Oracle视图中建立索引注意事项.doc
  20. linux指令英文含义,Linux —— 常见指令及其英文全称

热门文章

  1. int 类型的取值范围
  2. KVO 从基本使用到原理剖析
  3. 快速排序算法图解分析
  4. c语言蓝桥十进制转十六进制,蓝桥杯 基础练习 十进制转十六进制
  5. 权限管理系统中 管理员能看到所有用户的密码么_计算机毕设项目002之学生成绩管理系统...
  6. 6种常见的无线组网架构
  7. 应用存储和持久化数据卷:核心知识
  8. 授予数据库账号dba权限_从自建Oracle迁移至云原生数据仓库AnalyticDB PostgreSQL
  9. Postman响应断言
  10. hive 指定字段插入数据_Hive 表之间数据处理,Int 类型字段部分字段出现 NULL情况...