CRM手記- 11 | Django
阿新 • • 發佈:2018-01-24
展示 ava nbsp tab horizon 雙擊事件 版本 mon lte
# filter_horizontal 水平過濾 # 下拉框下的數據變多時,我們在多選的時候,就會麻煩; # 做一個與django-admin中的將選中的數據,移至右側框中的功能; # ManyToManyField自動生成的是多選框;Select; # 前端獲取filter_horizontal屬性下的值,判斷後生成對應的Select框; # 1.獲取左側選框內容,字段對應的所有數據; # 根據外鍵concult_courses字段名獲取表名; # >> c1 = models.objects.last() # 單個查詢對象|記錄 # >> c1_field_obj = c1._meta.get_field(‘consult_courses‘) # 對象的指定外鍵字段# >> c1_field_obj.rel.to # 獲取到外鍵字段對應的表的類 # <class ‘crm.models.Course‘> # >> c1_field_obj.rel.to.objects.all() # 獲取外鍵字段對應表的所有對象查詢集 # # >> 或者:cc1_field_obj.related_model # <QuerySet [<Course:python全棧>,<Course:運維自動化>]> # 在頁面展示m2m外鍵對應表的所有數據# table_obj_common.html <div class="col-sm-10"> {% if field.name in admin_class.filter_horizontal %} <!-- 如果在filter_horizontal內,自定義輸出框,兩個水平的select框 --> <div class="col-lg-5"> <select multiple> <!-- as 起別名,賦給變量 --> {% get_available_m2m_data field.name admin_class as available_obj%} {% for obj in available_obj %} <option value="{{ obj.id }}">{{ obj }}</option> {% endfor %} </select> </div> {% else %} {{ field }} {% endif %} <span style="color:red">{{ field.errors.0 }}</span> </div> # kingadmin_tag.py # m2m多選框左側選項 @register.simple_tag def get_available_m2m_data(field_name,admin_class): """獲取多對多字段關聯表的所有數據""" field_obj = admin_class.model._meta.get_field(field_name) obj_list = field_obj.related_model.objects.all() return obj_list # 註意:在django 1.8版本中自定義標簽賦值,是通過@register.assignment_tag這個裝飾器來完成的; # 在django 1.9版本中自定義標簽simple_tag直接將assignment_tag的功能合並了; # 2.獲取右側選框內容,即當前所選字段; # table_obj_common.html <div class="col-lg-4"> <select multiple> {% get_selected_m2m_data field.name form_obj admin_class as get_selected_m2m_data %} {% for obj in get_selected_m2m_data %} <option value="{{ obj.id }}">{{ obj }}</option> {% endfor %} </select> </div> # kingadmin_tag.py @register.simple_tag def get_selected_m2m_data(field_name,form_obj,admin_class): """返回m2m已選數據""" selected_data = getattr(form_obj.instance,field_name).all() return selected_data # 問題:怎麽去掉左側已經被選到右側的字段; # 措施:通過集合的差集操作; # >> c1 = models.objects.last() # 單個查詢對象|記錄 # >> s1 = set(getattr(c1,‘consult_courses‘).all()) # >> s2 = set(models.Course.objects.all()) # >> s2-s1 # 取得差集 # kingadmin_tag.py # m2m多選框左側選項 @register.simple_tag def get_available_m2m_data(field_name,form_obj,admin_class): """獲取多對多字段關聯表的所有數據""" field_obj = admin_class.model._meta.get_field(field_name) # 左側數據 obj_list = set(field_obj.related_model.objects.all()) # 右側顯示數據 selected_data = set(getattr(form_obj.instance,field_name).all()) return obj_list-selected_data # 3.左側雙擊事件,點擊之後展示上面的狀態; 通過js來做; # 略!
CRM手記- 11 | Django