ModelForm组件和forms组件补充
forms组件补充:
forms组件的三个字段:ChoiceField, ModelChoiceField & ModelMultipleChoiceField
# forms组件:ChoiceField,ModelChoiceField,ModelMultipleChoiceField:这三个可用于渲染 <select> 标签 gender = forms.ChoiceField(choices=((1,"男"),(2,"女"))) # 不与数据库打交道时用 ChoiceField; 语法:forms.ChoiceField(choices=(一个一个的元组)) # 和数据库打交道:
# 单选用ModelChoiceField:
publish = forms.ModelChoiceField(queryset=Publish.objects.all()) # 语法:forms.ModelChoiceField(queryset=QuerySet) # 多选用ModelMultipleChoiceField:
author = forms.ModelMultipleChoiceField(queryset=Author.objects.all()) # 语法:forms.ModelMultipleChoiceField(queryset=QuerySet)
ModelForms 组件:
ModelForms组件的作用:验证字段、渲染标签和与数据库交互
from django import forms
from django.forms import widgets class BookForm(forms.ModelForm):
class Meta:
model = Book # 这句代码的含义:把Book这张model表能够当成 form组件表去使用;同时 Book 这张model表和 BookForm 表一一对应
fields = "__all__" # forms 组件表所使用的字段
labels = { # 给字段添加 label
"title":"书籍名称",
"price":"价格"
}
widgets = { # 给字段添加 widgets
"title":widgets.TextInput(attrs={"class":"form-control"}),
"price":widgets.TextInput(attrs={"class":"form-control"}),
"date":widgets.TextInput(attrs={"class":"form-control","type":"date"}), # date类型的数据要在 .TextInput(attrs={"type":"date"}) 中 加上 attrs={"type":"date"}
"publish":widgets.Select(attrs={"class":"form-control"}), # 单选框要用 Select
"authors":widgets.SelectMultiple(attrs={"class":"form-control"}) # 多选框要用 SelectMultiple
}
error_messages = { # 为字段添加错误信息
"title":{"required":"不能为空"},
"price":{"required":"不能为空"},
} # 添加书籍信息
def addbook(request):
if request.method == "POST":
form = BookForm(request.POST) # 前端传过来的书籍信息(在request.POST中)传入 BookForm 进行验证
if form.is_valid(): # ModelForm 拥有 Form组件的方法 # 验证 form 是否合法
form.save() # form.save() 就是把该记录保存到 Book 这张model表中; # 因为 BookForm 和 Book 是对应关系,所以 save()时能直接存到 Book 表中 return redirect("/books/") form = BookForm() # 通过 BookForm 就能把 Book 这张model表当 Form表去使用 return render(request,"addbook.html",{"form":form}) # 把 form 传入前端,直接渲染 # 编辑书籍信息
def editbook(request,edit_book_id):
edit_book_obj = Book.objects.filter(pk=edit_book_id).first() if request.method == "POST":
form = BookForm(request.POST,instance=edit_book_obj)
if form.is_valid:
form.save() # 此时 .save()是 update 操作
"""
当 BookForm()中没有 instance= xx 时, form.save()是 create 操作;当 BookForm()中有 instance=obj 时,此时 form.save()是update 操作,并且是将 request.POST 中的数据更新到 前面的 instance=obj 这个对象中
"""
return redirect("/books/") form = BookForm(instance=edit_book_obj) # 拿 edit_book_obj 这个所要编辑的书籍对象,放入 BookForm中实例化得到 form,此时form传入前端渲染时,能把 所要编辑的书籍信息直接显示出来:<input>,<select>的value值、selected return render(request,"editbook.html",{"form":form}) """
model表中的 CharField,DateField,EmailField等等,只有在涉及到 ModelForm 的时候才有意义; ModelForm会让model表按照各自的 Field类型转化成相应的 forms 组件
"""
ModelForm组件和forms组件补充的更多相关文章
- forms组件补充与ModelForm简单使用与cookie与session
目录 forms组件钩子函数 forms组件字段参数 字段参数 validators详解 choices详解 widget详解 forms组件字段类型 ModelForm简单使用 cookie与ses ...
- Django-多对多关系的三种创建方式-forms组件使用-cookie与session-08
目录 表模型类多对多关系的三种创建方式 django forms 组件 登录功能手写推理过程 整段代码可以放过来 forms 组件使用 forms 后端定义规则并校验结果 forms 前端渲染标签组件 ...
- 多对多第三张表的创建方式 和 forms组件的使用
目录 一.多对多第三张表的创建 1. 全自动方式 (1)实现代码 (2)优点和不足 2. 纯手撸方式(了解) (1)实现代码 (2)优点和不足 3. 半自动方式(推荐使用) (1)实现代码 (2)优点 ...
- Python-S9—Day85-ORM项目实战之forms组件以及Modelform补充、跨域请求及应用
01 forms组件补充1 02 forms组件补充2 03 ModelForm回顾 04 浏览器的历史 05 jsonop实现跨域请求 06 jsonop实现跨域请求2 07 jsonop实现跨域请 ...
- Django基础之forms组件中的ModelForm组件
Django的model form组件 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,先来一个简单的例子来看一下这个东西怎么用:比如我们的数据库中有这样 ...
- Django框架的forms组件与一些补充
目录 一.多对多的三种创建方式 1. 全自动 2. 纯手撸(了解) 3. 半自动(强烈推荐) 二.forms组件 1. 如何使用forms组件 2. 使用forms组件校验数据 3. 使用forms组 ...
- python 全栈开发,Day78(Django组件-forms组件)
一.Django组件-forms组件 forms组件 django中的Form组件有以下几个功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显 ...
- Django组件——forms组件
一.校验字段功能 通过注册用户这个实例来学习校验字段功能. 1.模型:models.py from django.db import models # Create your models here. ...
- Django学习之八:forms组件【对form舒心了】
目录 Django forms组件 bound and unbound form instance forms渲染有关 隐藏一个字段,不渲染它 form 校验 form类 ModelForm 利用Mo ...
随机推荐
- 转】Spark SQL 之 DataFrame
原博文出自于: http://www.cnblogs.com/BYRans/p/5003029.html 感谢! Spark SQL 之 DataFrame 转载请注明出处:http://www.cn ...
- 窗体WINFORM
窗体的事件:删除事件:先将事件页面里面的挂好的事件删除,再删后台代码里面的事件 Panel是一个容器 1.Label -- 文本显示工具Text:显示的文字取值.赋值:lable1.Text 2.Te ...
- 把json数据转化成对象
把json数据转化到一个对象中,再用对象直接调用 package com.lxj.register; import java.io.BufferedReader; import java.io.IOE ...
- Visual SVN自动给文件加锁
在使用SVN作为版本控制器的时候,在VS里安装VISUALSVN插件,当修改文件公共文件的时候需要先Get Lock,如果对于多次操作这个鼠标操作显得是一些复杂,自动给文件加锁的操作实际是给文件加一个 ...
- php中字符与字节的区别
字符: 字符是可使用多种不同字符方案或代码页来表示的抽象实体.例如,Unicode UTF-16 编码将字符表示为 16 位整数序列,而 Unicode UTF-8 编码则将相同的字符表示为 8 位字 ...
- [小记]Android缓存问题
今天晚上,产品经理打电话说我们的Android App除了问题,问题很简单就是一个缓存问题,由于这个程序是前同事写的,我也只能呵呵一笑,有些事你就得扛.还是回到正题吧,这个缓存问题,实在有点奇葩,所以 ...
- InChatter系统开源聊天模块前奏曲
最近在研究WCF,又因为工作中的项目需要,要为现有的系统增加一个聊天模块以及系统消息提醒等,因此就使用WCF做服务器端开发了一个简单的系统. 开发最初学习了东邪孤独大哥的<传说的WCF系列> ...
- 总结几点sql语句优化
一.表设计阶段: 1.主键的使用 a.业务日志表.安全审计表采用自增长: b.自定义编号用于业务流程类表,根据一定的编号规则: c.int型主键 用于基础数据表: 2.逻辑删除字段的 ...
- mysql 5.7安装过程中,初始化的问题
初始化不指定参数文件,如使用以下命令初始化: ./mysqld --initialize --user=mysql --basedir=/data/mysql/barry_mysql --datadi ...
- redis-cli 工具--raw参数的作用
最近阅读了以redis官网关于--raw参数的解释,其功能有两个: 1.按数据原有格式打印数据,不展示额外的类型信息 例如:使用命令发送方式(redis在使用时有命令发送方式和交互方式两种)创建一个k ...