图书管理系统---基于form组件和modelform改造添加和编辑
添加 基于form组件改造
- 步骤1
1.为了区分自己写的form类和视图逻辑,所以工作中需要区分开来,那么就可以在应用下创建一个叫utils的文件夹,专门存放我们写的form类,py文件名随便起
2.在创建好py文件,如mymoforms.py文件中写上定义的模型类
3.修改html页面
4.编写逻辑

- 自定义模型类代码 myforms.py
from django import forms
from app01 import models
class BookForm(forms.Form):
'''书籍数据校验类'''
title = forms.CharField(
label='书名',
max_length=64,
# widget=forms.TextInput(attrs={'class':'form-control'})
)
pub_date = forms.CharField(
label='出版日期'
)
price = forms.DecimalField(
label='价格',
max_value=100,
min_value=1,
max_digits=10,
decimal_places=2,
)
pub = forms.ModelChoiceField(
label='出版社',
queryset=models.Publish.objects.all(),
)
authors = forms.ModelMultipleChoiceField(
label='作者',
queryset=models.Author.objects.all()
)
#想在自己定义的forms类初始化的时候统一加一些样式
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
#给所有的类里面加上一个属性
for name,field in self.fields.items():
field.widget.attrs.update({'class':'form-control'})
- add_book.html代码
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
</head>
<body>
<div class="container">
<h1>添加书籍</h1>
<div class="row">
<div class="col-md-8 col-md-offset-2">
<form action="" method="post" novalidate>
{% for field in form %}
<div class="form-group">
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
{{ field.errors.0 }}
</div>
{% endfor %}
<button class="btn btn-success pull-right">提交</button>
</form>
</div>
</div>
</div>
</body>
</html>
- 视图逻辑
def add_book(request):
if request.method == 'GET':
#实例化form类
form = BookForm()
return render(request, 'add_book.html', {'form':form})
elif request.method == 'POST':
print(request.POST)
#实例化一个对象
form = BookForm(data=request.POST)
if form.is_valid():
print(form.cleaned_data) #校验的时候会根据id查找得到对象
#{'title': '小雪', 'pub_date': '2020-02-04', 'price': Decimal('12.5'), 'pub': <Publish: 一本道出版社>, 'authors': <QuerySet [<Author: 王振>, <Author: 刘伟>]>}
authors_objs = form.cleaned_data.pop('authors')
book_obj = models.Book.objects.create(
**form.cleaned_data#直接用打散的方式,正好pub这个属性对应的是对象,如果是列名pub_id则需要对应具体的id值
)
book_obj.authors.add(*authors_objs) #添加作者关系
#上面这三步,可以直接用一个 form.save()方法就可以了
return redirect('book_list')
编辑 基于modelform组件改造
- 自定义的模型类
class BookModelForm(forms.ModelForm):
class Meta: #为上面这个类做一些原信息配置
model = models.Book #指定模型类
fields = '__all__' #指定Book模型类中的所有属性
'''
modelform会自动将这些属性转换为跟上面BookForm类中定义的属性一样
Book类里面的 pub = models.ForeignKey('Publish'),authors = models.ManyToManyField('Author')
会自动翻译成如下
pub = forms.ModelChoiceField(
label='出版社',
queryset=models.Publish.objects.all(),
)
authors = forms.ModelMultipleChoiceField(
label='作者',
queryset=models.Author.objects.all()
)
'''
labels={
'title':'书籍名称',
'pub':'出版社',
'price':'价格',
'pub_date':'出版日期',
'authors':'作者',
}
error_messages={
'title':{'required':'不能为空','max_length':'太长了,受不了'},
'price':{'required':'不能为空',}
}
# 想在自己定义的forms类初始化的时候统一加一些样式
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 给所有的类里面加上一个属性
for name, field in self.fields.items():
field.widget.attrs.update({'class': 'form-control'})
- edit_book.html文件
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
</head>
<body>
<div class="container">
<h1>编辑书籍</h1>
<div class="row">
<div class="col-md-8 col-md-offset-2" >
<!-- 不传路径,默认就是当前路径 -->
<form action="" method="post" novalidate>
{% for field in form %}
<div class="form-group {% if field.errors.0 %}has-error{% endif %}">
<label class="control-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
<span class="text-danger">{{ field.errors.0 }}</span>
</div>
{% endfor %}
<button class="btn btn-success pull-right">提交</button>
</form>
</div>
</div>
</div>
</body>
</html>
- 视图逻辑
#基于modleform来做编辑 先引入自己定义的modelform这个类
def edit_book(request,pk):
if request.method == 'GET':
old_book_obj = models.Book.objects.get(pk=pk)
# 想获取页面的时候,输入框中显示这条数据的原始记录必须用instance
#如果不传instance,那么就是一个添加页面的效果,也就是生成标签没有默认值
#作用是找寻给出的这个对象的所有属性记录值然后自动添加initial属性初始值
form = BookModelForm(instance=old_book_obj)
return render(request,'edit_book.html',{'form':form})
elif request.method == 'POST':
old_book_obj = models.Book.objects.get(pk=pk)
#如果没有传instance就是添加的效果,传了的话就是编辑
form = BookModelForm(data=request.POST,instance=old_book_obj)
if form.is_valid(): #进行校验
'''
authors_objs = form.cleaned_data.pop('authors')
book_obj = models.Book.objects.create(
**form.cleaned_data#直接用打散的方式,正好pub这个属性对应的是对象,如果是列名pub_id则需要对应具体的id值
)
book_obj.authors.add(*authors_objs) #添加作者关系
'''
#save()方法相当于就是做了上面三件事
form.save() #数据校验全部通过后,保存编辑,前提是instance=old_book_obj这个参数要添加,否则那就是添加一条数据了,而不是修改
return redirect('book_list')
else:
return render(request, 'edit_book.html', {'form': form})
图书管理系统---基于form组件和modelform改造添加和编辑的更多相关文章
- 图书管理系统 基于form组件
models: from django.db import models # Create your models here. class Book(models.Model): name = mod ...
- 基于Form组件实现的增删改和基于ModelForm实现的增删改
一.ModelForm的介绍 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 lab ...
- Django框架11 /form组件、modelForm组件
Django框架11 /form组件.modelForm组件 目录 Django框架11 /form组件.modelForm组件 1. form组件介绍 2. form常用字段与插件 3. form所 ...
- 图书管理系统(无中间件,用装饰器的)-----未基于FORM组件
目的:实现图书的增删改查 models.py from django.db import models # Create your models here. class Book(models.Mod ...
- Django——form组件和ModelForm
一.原生form实现书城增删改查 1.构建模型并完成数据库迁移 (1)构建书城模型 from django.db import models # Create your models here. # ...
- 2.1博客系统 |基于form组件和Ajax实现注册登录
基于forms组件和Ajax实现注册功能 1 基于forms组件设计注册页面 --点击头像 === 点击input --头像预览: 修改用户选中的文件对象:获取文件对象的路径:修改img的src属性, ...
- python 终极篇 --- form组件 与 modelForm
form组件 ...
- form组件之modelForm
modelForm的使用及参数设置 从modelForm这个名字就能看出来,这个form是和模型类model有知己诶关联的,还是以数和出版社的模型来说明: models.py(模型) from dja ...
- 6月28日 Django form组件 和 modelform组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django基于form组件实现注册校验
一 基本流程 1 创建form组件对应的类,比如LoginForm 2 前端的三种渲染方式: 渲染方式三种: 1 <form action="" novalidate met ...
随机推荐
- 【转帖】Linux开发工具 — readelf、objdump、hexdump
本博文的主要内容是:1)readelf工具查看ELF文件的信息:2)hexdump工具查看这块内存:3)objdump工具对文件进行反汇编. 前一段时间对Linux不熟,所以很多命令不知道.学习C时候 ...
- 【转帖】使用 LuaRocks 安装 Apache APISIX 依赖项时,为什么会导致超时、安装缓慢或安装失败?
使用 LuaRocks 安装 Apache APISIX 依赖项时,为什么会导致超时.安装缓慢或安装失败?# http://apisix.incubator.apache.org/zh/docs/ap ...
- 时间片 线程切换 指令周期 流水线 TPS的初步了解
时间片 线程切换 指令周期 流水线 TPS的初步了解 情况说明 Redis 单线程提供服务, 可以支撑十万级别的TPS 通过以个非常简单的测试 redis-benchmark -c 50 -n 500 ...
- SQLSERVER 标准版与企业版的版本标识区别
1. windows 标准版 sqlserver 标准版 2. Windows 数据中心版 sqlserver 企业版 3. Win10 之后 服务器版本缩减的很厉害 只有两个版本了 如图示 4. ...
- canvas操作图片像素点保证你看的明明白白
开场白 今天遇到一个场景:就是更改一个图片的颜色: 当听到这个.我直呼好家伙:这个是要上天了呀. 但是仔细一思考:借助canvas好像也能实现: 于是下来研究了一下,并不难: 我们下面来看看怎么实现的 ...
- 【JS 逆向百例】网洛者反爬练习平台第一题:JS 混淆加密,反 Hook 操作
关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...
- 2022美亚杯个人wp
检材文件下载链接:https://pan.baidu.com/s/1kg8FMeMaj6BIBmuvUZHA3Q?pwd=ngzs 提取码:ngzs 个人赛与团队赛下载文件解压密码:MeiyaCup2 ...
- 【5】数据可视化pygal,画出美观的图表
相关文章: 全网最详细超长python学习笔记.14章节知识点很全面十分详细,快速入门,只用看这一篇你就学会了! [1]windows系统如何安装后缀是whl的python库 [2]超级详细Pytho ...
- 【4】python读写文件操作---详细讲解!
相关文章: 全网最详细超长python学习笔记.14章节知识点很全面十分详细,快速入门,只用看这一篇你就学会了! [1]windows系统如何安装后缀是whl的python库 [2]超级详细Pytho ...
- 4.1 C/C++ 使用结构与指针
C/C++语言是一种通用的编程语言,具有高效.灵活和可移植等特点.C语言主要用于系统编程,如操作系统.编译器.数据库等:C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统.图形用户界面 ...