from和modelform的用法和介绍
from和modelform的用法和介绍
一 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)</span><span style="color: #0000ff;">return</span> redirect(<span style="color: #800000;">"</span><span style="color: #800000;">/book_list/</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">return</span> render(request,<span style="color: #800000;">"</span><span style="color: #800000;">add_book.html</span><span style="color: #800000;">"</span>,locals())</pre>
编辑功能
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</span>=<span style="color: #000000;">BookForm(book_dict)
</span><span style="color: #0000ff;">if</span> request.method==<span style="color: #800000;">"</span><span style="color: #800000;">POST</span><span style="color: #800000;">"</span><span style="color: #000000;">:
form_obj</span>=<span style="color: #000000;">BookForm(request.POST) # 接受用户传来的数据
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> form_obj.is_valid(): # 判断数据是否正常
book_obj.title</span>=form_obj.cleaned_data.get(<span style="color: #800000;">"</span><span style="color: #800000;">title</span><span style="color: #800000;">"</span><span style="color: #000000;">)
book_obj.publisher_id</span>=form_obj.cleaned_data.get(<span style="color: #800000;">"</span><span style="color: #800000;">publisher_date</span><span style="color: #800000;">"</span><span style="color: #000000;">)
book_obj.publisher_id</span>=form_obj.cleaned_data.get(<span style="color: #800000;">"</span><span style="color: #800000;">publisher</span><span style="color: #800000;">"</span><span style="color: #000000;">)
book_obj.save()
book_obj.authors.set(form_obj.cleaned_data.get(</span><span style="color: #800000;">"</span><span style="color: #800000;">authors</span><span style="color: #800000;">"</span><span style="color: #000000;">))
</span><span style="color: #0000ff;">return</span> redirect(<span style="color: #800000;">"</span><span style="color: #800000;">/book_list</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">return</span> render(request,<span style="color: #800000;">"</span><span style="color: #800000;">edit_book.html</span><span style="color: #800000;">"</span>,locals())</pre>
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</span>={ <span style="color: #008000;">#</span><span style="color: #008000;"> 设置每个字段的插件信息</span>
<span style="color: #800000;">"</span><span style="color: #800000;">title</span><span style="color: #800000;">"</span>: forms.widgets.TextInput(attrs={<span style="color: #800000;">"</span><span style="color: #800000;">class</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">form-control</span><span style="color: #800000;">"</span><span style="color: #000000;">}),
</span><span style="color: #800000;">"</span><span style="color: #800000;">phone</span><span style="color: #800000;">"</span>: forms.widgets.TextInput(attrs={<span style="color: #800000;">"</span><span style="color: #800000;">class</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">form-control</span><span style="color: #800000;">"</span><span style="color: #000000;">}),
</span><span style="color: #800000;">"</span><span style="color: #800000;">publisher</span><span style="color: #800000;">"</span>: forms.widgets.Select(attrs={<span style="color: #800000;">"</span><span style="color: #800000;">class</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">form-control</span><span style="color: #800000;">"</span><span style="color: #000000;">}),
</span><span style="color: #800000;">"</span><span style="color: #800000;">authors</span><span style="color: #800000;">"</span>: forms.widgets.SelectMultiple(attrs={<span style="color: #800000;">"</span><span style="color: #800000;">class</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">form-control</span><span style="color: #800000;">"</span><span style="color: #000000;">}), }
error_messages </span>= { <span style="color: #008000;">#</span><span style="color: #008000;"> 设置每个字段的报错提示信息</span>
<span style="color: #800000;">"</span><span style="color: #800000;">publisher</span><span style="color: #800000;">"</span><span style="color: #000000;">: {
</span><span style="color: #800000;">"</span><span style="color: #800000;">required</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">必须给我选一个出版社!</span><span style="color: #800000;">"</span><span style="color: #000000;">
},
</span><span style="color: #800000;">"</span><span style="color: #800000;">authors</span><span style="color: #800000;">"</span><span style="color: #000000;">:{
</span><span style="color: #800000;">"</span><span style="color: #800000;">required</span><span style="color: #800000;">"</span>:<span style="color: #800000;">"</span><span style="color: #800000;">必须选择一个作者</span><span style="color: #800000;">"</span><span style="color: #000000;"> }
}</span></pre>
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>
引用自[咳~](https://www.cnblogs.com/xu12135/p/9845598.html)
from和modelform的用法和介绍的更多相关文章
- 19-2 from和modelform的用法和介绍
一 form 1. form的作用 1. 生成HTML代码 2. 帮我们做数据有效性的校验 3. 保留上次输入内容,显示错误提示 2. form组件校验数据有效性 1. 内置的校验规则 1. re ...
- {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm
Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...
- Supervisord常见用法和介绍
Supervisord是用Python实现的一款非常实用的进程管理工具.supervisord会帮你把管理的应用程序转成daemon程序,而且可以方便的通过命令开启.关闭.重启等操作,而且它管理的进程 ...
- css3 2D动画的基本用法和介绍
<style> body{height:400px;border:1px solid #000;} .box{width:90px;height:30px;border:1px solid ...
- css3 transform的基本用法和介绍
<style>/* 最简单的一个transition动画 .box{width:100px;height:100px;border:1px solid;background:green;- ...
- Django之Form与ModelForm组件
Django之Form与ModelForm组件 1.Form介绍 Form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 O 保留上次的输入内容 普通方式手写注册功能 vi ...
- Android卸载程序之后跳转到指定的反馈页面
一个应用被用户卸载肯定是有理由的,而开发者却未必能得知这一重要的理由,毕竟用户很少会主动反馈建议,多半就是用得不爽就卸,如果能在被卸载后获取到用户的一些反馈,那对开发者进一步改进应用是非常有利的.目前 ...
- mysql5.5手册读书日记(3)
<?php /* MySQL_5.5中文参考手册 587开始 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修 ...
- ASP.NET Entity Framework with MySql服务器发布环境配置
首先,.net应该自带Entity Framework,所以服务器只要有对应版本的.net Framework就OK! 我们在开发环境中一般会直接使用edmx来管理应用程序与数据库的交互操作,所有与数 ...
随机推荐
- 【CF932E】Team Work
题目 luogu的Romtejudge挂了我就当我过了吧 求 \[\sum_{i=1}^n\binom{n}{i}i^k\] 其实是个思博套路题,但是我现在这个水平还是刷刷板子吧 处理\(x^k\)是 ...
- badboy的录制和jmeter的使用
v Jmeter是什么 Apache Jmeter是Apache组织开发的基于Java的压力测试工具. Jmeter可以用于对服务器.网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析 ...
- Spring容器管理各种文件
1. 导入文件 <import resource="applicationContext-dataSource.xml" /> 2. 引用资源配置文件 <cont ...
- Luogu P1401 城市(二分+网络流)
P1401 城市 题意 题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最 ...
- hdu1693 Eat the Trees [插头DP经典例题]
想当初,我听见大佬们谈起插头DP时,觉得插头DP是个神仙的东西. 某大佬:"考场见到插头DP,直接弃疗." 现在,我终于懂了他们为什么这么说了. 因为-- 插头DP很毒瘤! 为什么 ...
- 廖雪峰Java11多线程编程-2线程同步-1同步代码块
1.线程安全问题 多个线程同时运行,线程调度由操作系统决定,程序本身无法决定 如果多个线程同时读写共享变量,就可能出现问题 class AddThread extends Thread{ public ...
- 我的js运动库新
1.一些样式的获取和设置 //通过id获取当前元素 //params:id function $id(id) { return document.getElementById(id); } //向cs ...
- Django惰性加载和LazyObject
看登录中间件的时候发现request.user返回的是SimpleOject对象,往下看翻到了LazyObject,看源码看了半天没看懂 网上搜了一堆资料了解下惰性加载实现是的什么功能,再回去看源码, ...
- HTMl中常用标签
文本标记语言,即HTML(Hypertext Markup Language),是用于描述网页文档的一种标记语言. HTML之所以称为超文本标记语言,是因为文本中包含了所谓“超级链接”点.所谓超级链接 ...
- PAT甲级——A1031 Hello World for U
Given any string of N (≥) characters, you are asked to form the characters into the shape of U. For ...