一 form

1. form的作用

  1. 生成HTML代码
  2. 帮我们做数据有效性的校验
  3. 保留上次输入内容,显示错误提示

2. form组件校验数据有效性
  1. 内置的校验规则
  1. require=True 该字段必填
  2. max_length 该字段的最大长度
  3. min_length 该字段的最小长度

 2. 自定义校验规则
  1. 如手机号的格式 利用内置的正则校验器
  from django.core.validators import RegexValidator
  validators=[RegexValidator(r'^1[356789]\d{9}$', "手机号码格式不正确")],

3. 使用钩子函数做校验
 1. 局部钩子(hook)
           在form类内部定义一个 clean_字段名() 方法

 例子

  #自定义一个局部钩子函数含有alex的关键字不能提交
def clean_title(self):
value=self.cleaned_data.get("title") #获取书名
if "alex" in value:
raise ValidationError("ALEX以备和谐")
else:
return value

 2. 全局钩子
       在form类内部定义一个 clean() 方法

4. form组合如何给html标签设置默认值

  1. 每一个字段设置默认值
  initial="默认值"

实例:关于使用form的例子,使用form之前可以自己写一个单独的form类,我这里一添加book为例:

1 form.py

 from django import forms
from app01 import models
from django.core.exceptions import ValidationError #注册功能
from django.core.validators import RegexValidator # 检验手机号码是否正确 # 自己定义一个form类
class BookForm(forms.Form):
title=forms.CharField(
max_length=12,
min_length=2,
# 如果想让网页显示中文就加上label
label="书名",
initial="填写书名",
# 给tttle生成的input标签加上一个class类
widget=forms.widgets.TextInput(attrs={"class":"form-control"})
)
publisher_date=forms.DateField(
label="出版日期",
# widget 插件
widget=forms.widgets.DateInput(attrs={"type":"date","class":"form-control"})
)
phone=forms.CharField(
max_length=11,
validators=[RegexValidator(r'^1[356789]\d{9}$',"手机号码格式不正确")], # 限制手机号格式
widget = forms.widgets.TextInput(attrs={"class": "form-control"})
)
# 用modelchoicefield可以实时显示到页面上面当数据库增加的时候
publisher = forms.ModelChoiceField(
queryset=models.Publisher.objects.all(),
widget=forms.widgets.Select(attrs={"class": "form-control"}),
)
authors=forms.ModelMultipleChoiceField(
queryset=models.Author.objects.all(),
widget=forms.widgets.SelectMultiple(attrs={"class": "form-control"})
)
#自定义一个局部钩子函数含有alex的关键字不能提交
def clean_title(self):
value=self.cleaned_data.get("title") #获取书名
if "alex" in value:
raise ValidationError("ALEX以备和谐")
else:
return value

2 views.py里面的配置做了一些改变

首先要导入你刚才自己定义的BookForm

from app01.forms import BookForm 
def add_book(request):
form_obj=BookForm()
if request.method=="POST":
form_obj=BookForm(request.POST)
if form_obj.is_valid(): #做数据有效性校验
# 因为有多对多的字段,所以需要额外处理
authors=form_obj.cleaned_data.pop("authors")
# 创建新书籍对象
book_obj=models.Book.objects.create(**form_obj.cleaned_data)
# 讲书籍对象和作者建立关联
book_obj.authors.add(*authors) return redirect("/book_list/")
return render(request,"add_book.html",locals())

编辑功能

def edit_book(request,pk):
book_obj=models.Book.objects.filter(id=pk).first()
from django.forms import model_to_dict # 导入这个模块
book_dict=model_to_dict(book_obj) # 转换成字典格式
book_dict["publisher_date"]=book_obj.publisher_date.strftime("%Y-%m-%d") # 时间转换成字符串格式 form_obj=BookForm(book_dict)
if request.method=="POST":
form_obj=BookForm(request.POST) # 接受用户传来的数据
if form_obj.is_valid(): # 判断数据是否正常
book_obj.title=form_obj.cleaned_data.get("title")
book_obj.publisher_id=form_obj.cleaned_data.get("publisher_date")
book_obj.publisher_id=form_obj.cleaned_data.get("publisher")
book_obj.save()
book_obj.authors.set(form_obj.cleaned_data.get("authors"))
return redirect("/book_list")
return render(request,"edit_book.html",locals())

3 html里面也做了一些改变:(一些类的名字也都在forms里面给自动添加上了)

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加书籍</title>
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h1>添加书籍</h1>
<form action="" method="post" novalidate autocomplete="off">
{% for field in form_obj %}
<div class="form-group">
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
<p>{{ field.errors.0 }}</p> </div>
{% endfor %}
<input type="submit" class="btn btn-success">
</form> </div> </div> </div> </body>
</html>

二 model form

1. 必须继承forms.ModelForm

2. class Meta:
  model = "一对一关联的model类名"
  fields = "__all__"
3. 实例化
  1. BookModelForm(instance=book_obj)
  2. BookModelForm(request.POST, instance=book_obj)
4. form_obj.save()

要想使用modelform,也必须先写个modelform

modelform例子:

1 modelform.py

from django import forms
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
from app01 import models class BookModelForm(forms.ModelForm):
class Meta:
model=models.Book
fields="__all__" #model类里面所有的字段都展示
# fields="title" # 指定展示某些字段
# exclude=["title"] # 除了知道字段,其他字段都展示
# labels可以设置在网页上面显示的文字
labels={
"title":"书名",
"publisher_date":"创建日期",
"phone":"手机号",
"publisher":"出版社",
"authors":"作者", }
widgets={ # 设置每个字段的插件信息
"title": forms.widgets.TextInput(attrs={"class": "form-control"}),
"phone": forms.widgets.TextInput(attrs={"class": "form-control"}),
"publisher": forms.widgets.Select(attrs={"class": "form-control"}),
"authors": forms.widgets.SelectMultiple(attrs={"class": "form-control"}), }
error_messages = { # 设置每个字段的报错提示信息
"publisher": {
"required": "必须给我选一个出版社!"
},
"authors":{
"required":"必须选择一个作者" }
}

2 views.py里面设置:

要先导入你刚才写的那个

from app01.forms import BookModelForm

添加

def add_book(request):
form_obj = BookModelForm()
if request.method == "POST":
form_obj = BookModelForm(request.POST)
if form_obj.is_valid():
form_obj.save()
return redirect("/book_list/")
return render(request, "add_book.html", locals())

编辑

def edit_book(request, pk):
book_obj = models.Book.objects.filter(id=pk).first()
print("我是book_obj", book_obj)
# instance实例
form_obj = BookModelForm(instance=book_obj) # 实例化的form_obj
if request.method == "POST":
# 获取用户提交过来的数据,用request.POST传过来的数据去更新book_obj这本书
form_obj = BookModelForm(request.POST, instance=book_obj)
if form_obj.is_valid():
form_obj.save()
return redirect("/book_list/")
return render(request, "edit_book.html", locals())

3 html编辑和添加内容都是一样的

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加书籍</title>
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">
</head>
<body> <div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h1>添加书籍</h1> <form action="" method="post" novalidate autocomplete="off">
{% csrf_token %} {% for field in form_obj %}
<div class="form-group">
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
<p>{{ field.errors.0 }}</p>
</div>
{% endfor %}
<input type="submit" class="btn btn-success">
</form>
</div>
</div>
</div> </body>
</html>

19-2 from和modelform的用法和介绍的更多相关文章

  1. from和modelform的用法和介绍

    from和modelform的用法和介绍   一 form 1. form的作用 1. 生成HTML代码 2. 帮我们做数据有效性的校验 3. 保留上次输入内容,显示错误提示 2. form组件校验数 ...

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

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

  3. css3 2D动画的基本用法和介绍

    <style> body{height:400px;border:1px solid #000;} .box{width:90px;height:30px;border:1px solid ...

  4. css3 transform的基本用法和介绍

    <style>/* 最简单的一个transition动画 .box{width:100px;height:100px;border:1px solid;background:green;- ...

  5. Supervisord常见用法和介绍

    Supervisord是用Python实现的一款非常实用的进程管理工具.supervisord会帮你把管理的应用程序转成daemon程序,而且可以方便的通过命令开启.关闭.重启等操作,而且它管理的进程 ...

  6. Django之Form与ModelForm组件

    Django之Form与ModelForm组件 1.Form介绍 Form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 O 保留上次的输入内容 普通方式手写注册功能 vi ...

  7. 19、高可用工具heartbeat介绍

    19.1.heartbeat的作用: heartbeat的官方网站地址是:http://linux-ha.org/wiki/Main_Page 19.2.heartbeat工作原理: 19.3.hea ...

  8. mysql5.5手册读书日记(3)

    <?php /* MySQL_5.5中文参考手册 587开始 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修 ...

  9. Java最重要的21个技术点和知识点

    (五)Java最重要的21个技术点和知识点之网络编程.泛型.编程规范相关 写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚 ...

随机推荐

  1. exit()和return语句的区别

    (1)exit用于结束正在运行的程序,exit函数将参数是返回给OS.而return是返回函数值并退出函数. (2)return是语言级别的,它表示了调用堆栈的返回:而exit是系统调用级别的,它表示 ...

  2. 洛谷 P2886 [USACO07NOV]牛继电器Cow Relays

    题面 解题思路 ## floyd+矩阵快速幂,跟GhostCai爷打赌用不用离散化,最后完败..GhostCai真是tql ! 有个巧妙的方法就是将节点重新编号,因为与节点无关. 代码 #includ ...

  3. 你真的了解cookies吗?

    互联网隐私安全,直接放链接吧,这一篇非常好的文章,详细,全面,专业. http://www.freebuf.com/articles/web/127266.html 浅谈Web客户端追踪 一.   W ...

  4. volatile和指令重排序

    volatile 的作用 1 精致指令重排序 2 多线程访问同一个变量的时候,每次都是取最新的,而不会使用当前cpu缓存的那一份.

  5. CentOS 6.5 服务器相关配置

    vi /etc/sysconfig/network-scripts/ifcfg-eth0 #配置网卡 ONBOOT=YES #静态IPBOOTPROTO=static #启用地址协议 --static ...

  6. Docker镜像之commit

    利用 commit 理解镜像构成 基础知识 镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础.在之前的例子中,我们所使用的都是来自于 Docker Hub 的 ...

  7. Chapter 2 栈和队列

    Chapter 2 栈和队列 1-   栈 当n个元素以某顺序进栈,可在任意时刻出栈,元素排列的顺序N满足Catalan()规则: 常用操作: 1   栈的初始化和定义: 2   元素x进栈: 3   ...

  8. Jquery点击加载更多

    一.点击加载更多有点像分页获取数据类似,下面是本人写的一个简单的小例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  9. uva11401:Triangle Counting 递推 数学

    uva11401:Triangle Counting 题目读不清楚的下场就是多做两个小时...从1-n中任选3个不重复数字(不重复啊!!坑爹啊!)问能组成三角形的有多少个, 显然1~n能组成的三角形集 ...

  10. git pull拉取远程指定分支

    1.若git clone之后想拉取某个指定分支:先git pull ,然后git checkout 指定分支名称 2.若git clone之后想拉取某个指定分支:先git fetch origin 分 ...