一、多表单组合显示问题

在项目中用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解决多表单组合显示问题的更多相关文章

  1. [.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢?

    [.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢? 在ASP.NET Core应用程序中,接 ...

  2. django中ModelForm save方法 以及快速生成空表单或包含数据的表单 包含错误信息

    django中ModelForm学习系列一~save方法 Model代码 from django.db import models # Create your models here. class P ...

  3. Django中ModelForm应用

    Django中ModelForm的应用 在传统中Form提交的POST的数据在服务器端获取时将不得不一一获取并验证数据的可靠性,但是使用django提供的Form时可简化该过程并提供相应的验证,同时D ...

  4. Django 中 ModelForm 的使用

    定义 ModelForm 定制 ModelForm Meta 在 Form 中另外定义 Field 值得一提的一些 Field 转化 AutoField BooleanField ForeignKey ...

  5. Django中Model-Form验证

    Django中Model-Form验证 class UserType(models.Model): caption=models.CharField(max_length=32) class User ...

  6. Django - 请求与响应、表单、中间件、上下文处理器

    请求与响应篇 一.HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象.视图函数的第一个参数(request)是HttpRequest对象在djang ...

  7. html5中新增的form表单属性

    html5中新增两个表单属性,分别autocomplete和novalidate属性 1.autocomplete属性 该属性用于控制自动完成功能的开启和关闭.可以设置表单或者input元素,有两个属 ...

  8. 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 ...

  9. koa 基础(十一)koa 中 koa-bodyparser 中间件获取表单提交的数据

    1.app.js /** * koa 中 koa-bodyparser 中间件获取表单提交的数据 * 1.npm install --save koa-bodyparser * 2.引入 const ...

随机推荐

  1. 转:Python正则表达式指南

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...

  2. CRF++评测脚本CoNLL 2000

    关于CRF++工具如何使用这里就不再赘述了,网上相关资源很多,如官方提供的http://crfpp.googlecode.com/svn/trunk/doc/index.html.虽然http://w ...

  3. JavaScript之BON

    1.windows对象 全局作用域: 2.窗口关系及框架 如果页面包含框架,则每个框架都有自己的window对象,并且保存在iframes集合中,在iframe集合中,可以通过数值索引(从0开始,从左 ...

  4. leetcode824

    class Solution { public: void SplitString(const string& s, vector<string>& v, const st ...

  5. leetcode883

    int projectionArea(vector<vector<int>>& grid) { ; ; ; ; i < grid.size(); i++) { r ...

  6. PHP 环境安装

    官方 http://www.php.net/ http://php.net/manual/zh/install.php http://php.net/manual/zh/index.php 下载也就是 ...

  7. 可变、不可变数据类型和hash

    一.可变和不可变数据类型 在python中,我们对数据类型除了分为数字类型.字符串类型.列表类型.元组类型.字典类型和集合类型外, 还有另外一种分类方式,我们给数据类型分为可变数据类型和不可变数据类型 ...

  8. js确定来源页然后跳转

    <script type="text/javascript"> function Navigate() { if(document.referrer == 'http: ...

  9. 制作第三方SDK静态库、.framework(修正)

    静态库和动态库的存在形式 静态库: .a 和 .framework 动态库: .dylib 和 .framework 静态库和动态库的使用区别: 静态库:链接时,静态库会被完整地复制 到 可执行文件中 ...

  10. opennebula 模板参数说明

    两种模板配置方式一.光驱引导启动需要配置:disk1:磁盘类型:cdrom      驱动类型:file      磁盘标记:hd      是否只读:yesDisk2:磁盘类型:DATABLOCK驱 ...