django中ModelForm解决多表单组合显示问题
一、多表单组合显示问题
在项目中用ModelForm生成页面时
当有多表单组合显示时,会显示全部的关联表单数据。
而在实际项目中可能会出现只想让用户选择部分数据,这时候这样的显示就有问题。
二、问题解决方案
views.py
实例化Form对象时注意把当前登录用户对象传到Form中
class Add_Edit_ConsultRecord(View):
def get(self, request, edit_id=None):
if edit_id is None:
# 新增get,# 实例化一个包含当前销售的跟进记录
consult_obj = ConsultRecord(consultant=request.user)
else:
# 编辑get,
consult_obj = ConsultRecord.objects.filter(pk=edit_id).first()
form_obj = ConsultRecordForm(instance=consult_obj)
return render(request, "consultrecord_change.html", {'form_obj': form_obj, 'edit_id': edit_id}) def post(self, request, edit_id=None):
if edit_id is None:
# 新增post,# 实例化一个包含当前销售的跟进记录
consult_obj = ConsultRecord(consultant=request.user)
else:
# 编辑post,
consult_obj = ConsultRecord.objects.filter(pk=edit_id).first()
form_obj = ConsultRecordForm(request.POST, instance=consult_obj)
if form_obj.is_valid():
# 通过数据校验
form_obj.save()
return redirect(reverse("consult_records", args=('')))
相比较BaseForm,BaseModelForm多了instance参数,它等价于Model模型的一个实例
ModelForm中传递了initial也一样可以生效,同时还会设置到Model中
form.py
class BootForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs.update({'class': 'form-control'})
field.error_messages = {"required": "该字段不能为空"}
# 跟进记录Form
class ConsultRecordForm(BootForm):
class Meta:
model = ConsultRecord
fields = "__all__" def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 清除delete_status字段的样式
self.fields['delete_status'].widget.attrs.pop('class') # 当前登录的用户(销售)对象
# print(self.instance.consultant)
# self.fields['customer'].choices = [('', '---------'), (2, '239966930011'),]
"""
相比较BaseForm,BaseModelForm多了instance参数,它等价于Model模型的一个实例
ModelForm中传递了initial也一样可以生效,同时还会设置到Model中
# self.instance.consultant.customers.all()
先得到当前登录对象,再通过销售对象反向查询客户对象
通过列表生成式生成choices结构[('', '---------'),(1,'2399669300'), (2, '239966930011'),]
"""
# 限制添加和编辑时多选框显示的所咨询客户只能是自己跟进的,
customer_choices = [(i.pk, str(i)) for i in self.instance.consultant.customers.all()]
customer_choices.insert(0, ('', '---------'))# insert 列表插入数据,默认选择框
# 将原本的客户对像替换掉
self.fields['customer'].choices = customer_choices
# 限制添加和编辑时多选框显示的跟进人只能是当前登录人,
# print(list(self.fields['customer'].widget.choices))
self.fields['consultant'].choices = [(self.instance.consultant.pk, self.instance.consultant.username)]
django中ModelForm解决多表单组合显示问题的更多相关文章
- [.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢?
[.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢? 在ASP.NET Core应用程序中,接 ...
- django中ModelForm save方法 以及快速生成空表单或包含数据的表单 包含错误信息
django中ModelForm学习系列一~save方法 Model代码 from django.db import models # Create your models here. class P ...
- Django中ModelForm应用
Django中ModelForm的应用 在传统中Form提交的POST的数据在服务器端获取时将不得不一一获取并验证数据的可靠性,但是使用django提供的Form时可简化该过程并提供相应的验证,同时D ...
- Django 中 ModelForm 的使用
定义 ModelForm 定制 ModelForm Meta 在 Form 中另外定义 Field 值得一提的一些 Field 转化 AutoField BooleanField ForeignKey ...
- Django中Model-Form验证
Django中Model-Form验证 class UserType(models.Model): caption=models.CharField(max_length=32) class User ...
- Django - 请求与响应、表单、中间件、上下文处理器
请求与响应篇 一.HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象.视图函数的第一个参数(request)是HttpRequest对象在djang ...
- html5中新增的form表单属性
html5中新增两个表单属性,分别autocomplete和novalidate属性 1.autocomplete属性 该属性用于控制自动完成功能的开启和关闭.可以设置表单或者input元素,有两个属 ...
- Django报错:提交表单报错---RuntimeError: You called this URL via POST, but the URL doesn’t end in a slash and you have APPEND_SLASH set.
Django报错:提交表单报错---RuntimeError: You called this URL via POST, but the URL doesn’t end in a slash and ...
- koa 基础(十一)koa 中 koa-bodyparser 中间件获取表单提交的数据
1.app.js /** * koa 中 koa-bodyparser 中间件获取表单提交的数据 * 1.npm install --save koa-bodyparser * 2.引入 const ...
随机推荐
- L1,L2范数和正则化 到lasso ridge regression
一.范数 L1.L2这种在机器学习方面叫做正则化,统计学领域的人喊她惩罚项,数学界会喊她范数. L0范数 表示向量xx中非零元素的个数. L1范数 表示向量中非零元素的绝对值之和. L2范数 表 ...
- springboot整合图像数据库Neo4j
百度百科: Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从 ...
- NMS:Non-maximum Suppression学习笔记
非极大值抑制可看成一种局部极大值搜索,这里的局部极大值要比他的邻域值都要大.这里的邻域表示有两个参数:维度和n-邻域.维度有1-D,2-D,3-D...:至于n值根据具体情况设置.举个例子:一维的情况 ...
- LoadRunner 脚本开发和常用函数
开发性能测试脚本原则.简单 正确 高效 在lr中,脚本运行是解释执行的.所以在运行时,需要先编译. 局部变量和全局变量 1.在init.action.end中定义的变量就是局部变量 2.在global ...
- Docker学习笔记_进入正在运行的Docker容器
如何进入正在运行的Docker容器? 这里记录一种方法. 1.先查看container ID,并确认这个容器已经启动 docker ps -a #列出懿创建的所有容器 docker ps ...
- 新装的Ubuntu没有ipconfig和ping命令
新装的Ubuntu或者Docker pull的Ubuntu镜像创建的容器没有ipconfig和ping命令 解决办法: 1.apt-get update 2.安装和ifconfig有关的工具 apt ...
- Marvel
Marvel and what it is From http://www.tuicool.com/articles/qA3yau With marvel you can get an overvie ...
- Makefile 调试
一.简介 GNU make 提供了若干可以协助调试的内置函数以及命令行选项. 用来调试makefile 的一个最好方法就是加入调试挂钩以及使用具保护的编程技术,让你能够在事情出错时恢复原状. 二.ma ...
- 第二章启程前的认知准备,2.1Opencv官方例程引导与赏析
1.在opencv安装目录下,可以找到opencv官方提供的示例代码,具体位于...\opencv\sources\samples目录下,如下所示 名为c的文件夹存放着opencv1.0等旧版本的示例 ...
- TP5多入口设置
今天在用tp5做项目的时候发现,前台是可以绑定默认到index模块的,但是后台不好弄,于是查了一下手册,按照手册上说的,复制了index.php改为admin.php,作为后台的入口文件,于是域名/a ...