Django-Form组件-formset_factory
Formset
多个表单的集合,可以同时提交多个from表单中的数据,在web页面中,可以在同一个页面,提交多个form表单。
Django针对不同的formset提供了3种方法: formset_factory, modelformset_factory和inlineformset_factory。下面对modelformset_factory进行示例展示
主要的变化是在视图函数中
from django.forms import modelformset_factory
def study_record(request,courserecord_id):
# modelformset_factory 支持在同一页面显示多个form,一个form就是作为一条记录,可以直接在本也米娜对from中的内容进行修改
formset = modelformset_factory(model=models.StudyRecord,form=StudyRecordForm,extra=0)
formset_obj = formset(queryset=models.StudyRecord.objects.filter(course_record_id=courserecord_id))
if request.method == 'POST':
formset_obj = formset(data=request.POST)
if formset_obj.is_valid():
formset_obj.save()
next = request.GET.get('next')
print(next)
return redirect(next)
return render(request,'teacher/studyrecord_list.html',{'formset_obj':formset_obj})
【注意】
初始化fromset时,使用的参数:model;form;extra=0,等于1时,会有一个额外的空选项
实例化fromset时,使用的参数:queryset
ModelForm中
class BaseForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 自定义操作,循环添加class操作,当遇到MultiSelectFormField或者forms.BooleanField框时,不加class类
for name, field in self.fields.items():
# if name == 'course' # 可以直接判断字段名
if isinstance(field, (MultiSelectFormField, forms.BooleanField)):
# 判断字段类型是MultiSelectFormField, forms.BooleanField还可以根据需求继续添加到元组中,让他们的格式不接受form-control的样式
continue
# 方式一:
field.widget.attrs['class'] = 'form-control'
# 方式二:
# field.widget.attrs.update({'class': 'form-control'})
class StudyRecordForm(BaseForm):
class Meta:
model = models.StudyRecord
fields = '__all__'
html中注意 {{ formset_obj.management_form }}
<form action="" method="post">
{% csrf_token %}
{{ formset_obj.management_form }}
<div>
<button class="btn btn-primary btn-sm">保存</button>
</div>
<table class="table table-hover" id="tableList">
<thead>
<tr>
<th>序号</th>
<th>学生姓名</th>
<th>考勤</th>
<th>成绩</th>
<th>批语</th>
</tr>
</thead>
<tbody id="UserList">
{% for obj in formset_obj %}
<tr class="relative" data-id="3">
{{ obj.id }}
<td class="table-edit">{{ forloop.counter }} </td>
<td class="table-edit">{# 让姓名编程不可修改项 #}
<a href=""> {{ obj.instance.student }}</a>
</td>
<td>{{ obj.attendance }}</td>
<td class="table-edit">{{ obj.score }}</td>
<td class="table-edit">{{ obj.homework_note }}</td>
<td class="hidden">{{ obj.course_record }}</td>
<td class="hidden">{{ obj.student }}</td>
{# 这两项隐藏的目的是,form表单提交数据时需要对其进行验证,二是不需要让使用者看见,因为他是默认的,不需要跟进修改 #}
</tr>
{% endfor %}
</tbody>
</table>
</form>
Django-Form组件-formset_factory的更多相关文章
- django Form组件
django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...
- 9.24 Django Form组件
2018-9-23 20:10:04 这两天优化了自己图书管理系统 github 连接:https://github.com/TrueNewBee/pythonDemo 顺便整理了博客,写了好多总结, ...
- Django—Form组件
Django From简介 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比 ...
- django form组件 cookies,session
django form组件 渲染标签 就是组件里面的字段在前端展示叫做渲染标签 校验数据 用户输入的数据提交给后端组件叫做校验数据 forms组件中定义的字段都是必须传值的(required=Tr ...
- 6月28日 Django form组件 和 modelform组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Python Web框架篇:Django Form组件
Form简介 在HTTP中,表单(form标签),是用来提交数据的,其action属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...
- Web框架django[Form]组件
新手上路 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 # 创 ...
- 32.Django form组件
Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 创建Form类时,主要涉及到 [ ...
- 饮冰三年-人工智能-Python-27 Django Form组件
Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 后台逻辑(导包+建类) from django ...
- 9.Django form组件
Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 创建Form类时,主要涉及到 [ ...
随机推荐
- xml树结构
概念:XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据.经常被用来作为配置文件使用. XML 使用DTD(document t ...
- Linux一些常用的命令
常见命令 cd命令 cd命令用来切换工作目录至dirname, 其中dirName表示法可为绝对路径或相对路径. pwd命令 pwd命令以绝对路径的方式显示用户当前工作目录. ls命令 ls命令用来显 ...
- “景驰科技杯”2018年华南理工大学程序设计竞赛 A. 欧洲爆破(思维+期望+状压DP)
题目链接:https://www.nowcoder.com/acm/contest/94/A 题意:在一个二维平面上有 n 个炸弹,每个炸弹有一个坐标和爆炸半径,引爆它之后在其半径范围内的炸弹也会爆炸 ...
- 【Android-ListView控件】显示信息
效果图 布局文件 layout - activity_main.xml 在主布局添加一个listview控件 <?xml version="1.0" encoding=&qu ...
- 【方法】移动端H5如何调用相册和相机上传图片、音频、视频
在移动端上传图片方法很简单,使用HTML5中的input:file供文件上传. <一>常用属性值: 1.accept:规定文件上传来提交的文件类型,此属性只能和type:file配合使用 ...
- Verilog状态机使用技巧
“没有什么难处是通过增加一个状态机不能够解决的,如果不行,那就俩..” 在实现某种功能时,若感觉该功能的各种可能状态间的切换太绕了,此时,增加一个状态机往往能使思路变得清晰,功能的实现也就简单明了了. ...
- HDOJ 4858 项目管理 ( 只是有点 莫队的分块思想在里面而已啦 )
题目: 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 题意: 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的! ...
- Django基础之request对象
当一个页面被请求时,django就会创建一个包含本次请求原信息的HttpRequest对象. django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用request参数承接这个对象 ...
- Python基础之集合set
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型), 但是集合本身是不可哈希的(所以集合做不了字典的键)的. 以下是集合最重要的两点: (1)去重,把一个列表变成集合,就自动去重了. ...
- Codeforces 1111 E. Tree(虚树,DP)
题意 有一棵树,q个询问,每次询问,指定一个点做树根,再给定k个点,要求把这些点分成不超过m组的方案数,分配的限制是任意两个有祖先关系的点不能分在同一组.题目还保证了所有的询问的k加起来不超过1e5. ...