CRM表单select选择框,左边选择框是待选的数据,右边是已经选择了的数据
1、前端显示代码在table_objs_change.html:
<div class="col-sm-10">
{#<input type="email" id="inputEmail3" placeholder="{{filed_form}}">#}
{% if filed_form.name in admin_class.filter_horizontal%}
<div class="col-lg-5">
{% get_m2m_choose_data admin_class filed_form form_obj as m2m_obj_list%}
<select multiple class="filter-select-box">
{% for m2m_obj in m2m_obj_list%}
<option value="{{m2m_obj.id}}">{{m2m_obj}}</option>
{% endfor %}
</select>
</div>
<div class="col-md-1">
箭头
</div>
<div class="col-lg-5">
{% get_m2m_selected_obj filed_form form_obj as m2m_seleced_list %}
<select multiple class="filter-select-box">
{% for m2m_selected_obj in m2m_seleced_list %}
<option value="{{m2m_selected_obj.id}}">{{m2m_selected_obj}}</option>
{% endfor %}
</select>
</div>
{% else %}
{{filed_form}}
{% endif %}
</div>
2、后端返回待选的数据的处理,如果是右边的有了已选的数据那么左边选择框则不在显示已选择的数据在tags.py
@register.simple_tag
def get_m2m_choose_data(admin_class,filed_form,filed_obj):
#获取所有待选的数据
"""
:param admin_class: Customer
:param filed_form: 表单
:param filed_obj :表单List
:return: 返回没有在右边表单框的数据
"""
field_obj = getattr(admin_class.model,filed_form.name)
#表结构对象的某个字段
all_obj_list =field_obj.rel.model.objects.all()
#单条数据的对象中的某个字段
obj_instance_field = getattr(filed_obj.instance,filed_form.name)
seleced_obj_list =obj_instance_field.all()
standby_obj_list =[]
for all_obj in all_obj_list:
if all_obj not in seleced_obj_list:
standby_obj_list.append(all_obj)
return standby_obj_list
上面代码的记忆部分,在多对多里面找出所有的待选数据 :
field_obj = getattr(admin_class.model,filed_form.name)
#表结构对象的某个字段
all_obj_list =field_obj.rel.model.objects.all() == models.Customer.tags.rel.model.objects.all()
相当于:
getattr(models.Customer,'tags')
<django.db.models.fields.related_descriptors.ManyToManyDescriptor object at 0x042208B0>
>>>
>>> models.Customer.tags
<django.db.models.fields.related_descriptors.ManyToManyDescriptor object at 0x042208B0>
>>>
models.Customer.tags.rel.model.objects.all()
<QuerySet [<Tag: 你会转行成功的>, <Tag: 你是一个纯纯的屌丝>, <Tag: 我们还会遇见吗>, <Tag: 我有钱我怕什么>, <Tag:
所以你好>]>
注:对于Django1 可以通过 models.Customer.tags.to.model.objects.all() 获取一个model下的ManytoMany字段下的所有内容;
在Django2 中rel下的to方法被去掉了,直接调用to方法会报 'ManyToManyRel' object has no attribute 'to' 错误,在Django2 中可以用rel下的model方法实现相同的功能,如:models.Customer.tags.rel.model.objects.all()
3、后端处理已选的数据在tags.py
@register.simple_tag
def get_m2m_selected_obj(filed_form,form_obj):
"""
:param filed_form: 表单
:param form_obj: 表单list
:return:
"""
field_obj = getattr(form_obj.instance,filed_form.name)
return field_obj.all()
注:表单对象form_obj有instance,然后去找字段名,在用它all()获取已选的数据:form_obj.instance.tags.all(),获取manytomany的数据这下面几个记忆:
#这个是只会筛选出已经选择了的
models.Customer.objects.last().tags.all()
<QuerySet []>
# 获取到Tag这个类
>>> models.Customer.objects.last().tags.model
<class 'PerfectCRM.Perfectcrm.crm.models.Tag'>
#获取到这个类的标签,
models.Customer.objects.last().tags.model.objects.all()
<QuerySet [<Tag: 你会转行成功的>, <Tag: 你是一个纯纯的屌丝>, <Tag: 我们还会遇见吗>,<Tag:
所以你好>]>
#获取到这个类的标签,django2.2
models.Customer.tags.rel.model.objects.all()
<QuerySet [<Tag: 你会转行成功的>, <Tag: 你是一个纯纯的屌丝>, <Tag: 我们还会遇见吗>,<Tag:
所以你好>]>
getattr(models.Customer,'tags')
<django.db.models.fields.related_descriptors.ManyToManyDescriptor object at 0x042208B0>
>>>
>>> models.Customer.tags
<django.db.models.fields.related_descriptors.ManyToManyDescriptor object at 0x042208B0>
>>>