第一个select存放对象字段没有的数据,第二个select存放已经有的数据
{% get_field_obj_list field admin_class form_obj as field_obj_list %}
<select tag="chosen_list" multiple id="id_{{ field.name }}_from" class="filter_select_box">
{% for obj in field_obj_list %}
<option value="{{ obj.id }}" ondblclick="MoveEleTo(this, 'id_{{ field.name }}_to', 'id_{{ field.name }}_from')">{{ obj }}</option>
{% endfor %}
</select>
{% get_field_selected_obj_list field form_obj as field_selected_obj_list %}
<select multiple id="id_{{ field.name }}_to" class="filter_select_box">
{% for obj in field_selected_obj_list %}
<option value="{{ obj.id }}" ondblclick="MoveEleTo(this, 'id_{{ field.name }}_from', 'id_{{ field.name }}_to')">{{ obj }}</option>
{% endfor %}
</select>
通过简单标签得到两个select的数据
.all() 是具体的字段对象才有的方法,想获得表的字段的所有对象要用rel.model.objects.all()
获得具体字段的对象使用视图函数中传入的instance参数再调用all()方法
- 注意!rel.model.objects.all()是Django2.0的写法,rel.to.objects.all()是1.0版本的写法
@register.simple_tag
def get_field_obj_list(field, admin_class, form_obj):
'''返回所有待选数据'''
# 表结构对象的某个字段
field_obj = getattr(admin_class.model, field.name)
# 包括了所有的数据
all_obj_list = field_obj.rel.model.objects.all()
# all_obj_list = field_obj.objects.all()
# 单条数据的对象中的某个字段
obj_instance_field = getattr(form_obj.instance, field.name)
selected_obj_list = obj_instance_field.all()
# 把不在单条数据的的数据存入待选列表中
standby_obj_list = []
for obj in all_obj_list:
if obj not in selected_obj_list:
standby_obj_list.append(obj)
return standby_obj_list
@register.simple_tag
def get_field_selected_obj_list(field, form_obj):
'''返回已选择的数据'''
field_obj = getattr(form_obj.instance, field.name)
return field_obj.all()
实现鼠标点击左右调换功能:
原理就时点击左边右边新加一个option标签,左边删除 ele
- ele = this ,为必传参数
- 记住做字符串拼接时一定要给属性内容打上双引号
function MoveEleTo(ele, taget_id, new_taget_id) {
var opt_ele = "<option value='" + $(ele).val() + "' ondblclick=\"MoveEleTo(this, '" + new_taget_id + "', '" + taget_id + "')\">" + $(ele).text() + "</option>";
console.log(opt_ele)
$("#" + taget_id).append(opt_ele);
$(ele).remove();
}