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. Python3基础 list + *运算 扩充列表

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  2. MongoDB的常用操作总结

    简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. ...

  3. 关于no matching key exchange method found. Their offer: diffie-hellman-group1-sha1的解决办法

    原文链接:https://mycyberuniverse.com/error/no-matching-key-exchange-method-found-openssh7.html What caus ...

  4. (转) The care and maintenance of your adviser

    The care and maintenance of your adviser Ever since the advent of graduate school, students have com ...

  5. [ajaxupload] - 上传文件同时附件参数值

    $.ajax({ url: '/excel/importExcel?instance='+"品种1", type: 'POST', data: formData, 上面前端通过?拼 ...

  6. Kubernetes体系结构

      Nodes Node Status Addresses Phase Condition Capacity Info Management Node Controller Self-Registra ...

  7. Qt基础学习(3)-----滑动条之QSlider

    //mydialog.h #ifndef MYDIALOG_H #define MYDIALOG_H #include <QDialog> class QLineEdit; class Q ...

  8. P1230 智力大冲浪

    题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则: ...

  9. 踩坑记录:spring boot的POST请求数据注入不了的问题

    概述: 今天在使用spring boot框架的时候,踩了一个坑,是关于control层request body依赖注入的问题的,内容如下: 进过: 由于目前公司采用的系统架构,要求把springboo ...

  10. php格式化数字输出number_format

    <?php $num = 4999.944444; $formattedNum = number_format($num).PHP_EOL; echo $formattedNum; $forma ...