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.title class 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.Book
fields="__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) # 方式3
form = 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>

    

Django ModelForm 组件的应用的更多相关文章

  1. Django - ModelForm组件

    一.ModelForm组件 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,先来一个简单的例子来看一下这个东西怎么用:比如我们的数据库中有这样一张学生表, ...

  2. Django之modelform组件

    一.简介与基本使用 简介:django中的modelform组件同时具有model和form作用,但是耦合度比较高,当项目需要拆分时候就比较困难了,所以在使用modelform时候需要先考虑项目的扩展 ...

  3. Django之 Form和ModelForm组件

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

  4. django中forms和modelform组件的区别

    首先,我们来看看modelform的实现 model.py class Book(models.Model): title=models.CharField(max_length=32) price= ...

  5. Django Form和ModelForm组件

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

  6. Django之Form、ModelForm 组件

    Django之Form.ModelForm 组件 一.Form组件: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此 ...

  7. {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm

    Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...

  8. Django基础十之Form和ModelForm组件

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

  9. Django框架 之 modelform组件

    Django框架 之 modelform组件 浏览目录 创建mldelform 添加记录 编辑记录 Django框架中的modelform组件 通过名字我们可以看出来,这个组件的功能就是把model和 ...

随机推荐

  1. CentOS 安装 MongoDB

    一.安装mongodb 本文介绍的安装方式是以二进制方式离线安装,相当于windows"绿色"安装版本的概念. 下载mongodb: # https://www.mongodb.c ...

  2. POJ 1251 + HDU 1301 Jungle Roads 【最小生成树】

    题解 这是一道裸的最小生成树题,拿来练手,题目就不放了 个人理解  Prim有些类似最短路和贪心,不断找距当前点最小距离的点 Kruskal类似于并查集,不断找最小的边,如果不是一棵树的节点就合并为一 ...

  3. tp框架中的一些疑点知识-5

    关于vim中的缓存区的前后bp和bn的界定 通过命令ls可以看到 缓存区的 排序. 最开始打开的文件排在最上面, 序号最小. 那么它们就是 更 前 的缓冲区. 序号更前的用bp, 序号靠后的用bn. ...

  4. 【分片无法挂载】Elasticsearch分片和副本无法挂载(分片移位)

    部署说明 硬件 服务器两台: 机器A:64G内存 机器B:32G内存 分片 共12个节点 2个查询节点,10个存储节点 8个主分片 1个复制分片(每个分片都有一个副本分布在不同的节点上面) 每台机器都 ...

  5. Sql 通过表名查找所有列名

    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'ImmediacyOutKu'

  6. C#winform的textbox怎么设置滚动条

    用 C#开发软件的时候文本框textbox是没有滚动条的,而且是单行文本.下面教大家如何设置多行,并且设置横向滚动条和垂直滚动条. 打开VS工具,创建一个winform窗体项目.系统会自动创建一个主窗 ...

  7. gawk命令详解

    GNU awk: sort.cut.uniq.wc等参考: https://blog.csdn.net/lk07828/article/details/46324807 https://blog.cs ...

  8. js之鼠标随动后面跟随事件(类似于长龙跟着跑)

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  9. HTML的Doctype

    1. <!DOCTYPE> 声明位于文档中的最前面,处于 <html> 标签之前.告知浏览器的解析器,用什么文档类型 规范来解析这个文档. 2. 严格模式的排版和 JS 运作模 ...

  10. 前端如何应对笔试算法题?(用node编程)

    用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...