diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html
index 9bf9f122f..c8333eff3 100644
--- a/apps/assets/templates/assets/asset_list.html
+++ b/apps/assets/templates/assets/asset_list.html
@@ -27,23 +27,6 @@
     </div>
 {% endblock %}
 
-{% block tags_list %}
-<div class="ydxbd" id="ydxbd" style="display: none;">
-    <div class="tagBtnList">
-    {% for tag in tag_list %}
-        <a href="{% url 'assets:asset-tags' tag_id=tag.0 %}"
-           {% if tag.0 == tag_id %}
-           class="tagBtn2 label label-warning" name="tag_on">
-           {% else %}
-           class="tagBtn2 label label-default">
-           {% endif %}
-           {{ tag.1}}({{ tag.2 }})
-        </a>
-    {% endfor %}
-        <a href="{% url 'assets:asset-list' %}" class="tagBtn2 label label-default" >移除选择</a>
-    </div>
-</div>
-{% endblock %}
 
 {% block table_container %}
 <div class="uc pull-left m-l-5 m-r-5"><a href="{% url "assets:asset-create" %}" class="btn btn-sm btn-primary"> {% trans "Create asset" %} </a></div>
diff --git a/apps/templates/_base_list.html b/apps/templates/_base_list.html
index aeed66ff5..83834a1d5 100644
--- a/apps/templates/_base_list.html
+++ b/apps/templates/_base_list.html
@@ -3,7 +3,7 @@
 {% load i18n %}
 {% block custom_head_css_js %}
     <link href="{% static "css/plugins/dataTables/datatables.min.css" %}" rel="stylesheet">
-    <link href="{% static "css/plugins/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css" %}" rel="stylesheet">
+{#    <link href="{% static "css/plugins/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css" %}" rel="stylesheet">#}
     <link href="{% static "css/plugins/select2/select2.min.css" %}" rel="stylesheet">
     <script src="{% static "js/plugins/select2/select2.full.min.js" %}"></script>
     <script src="{% static "js/plugins/dataTables/dataTables.min.js" %}"></script>
diff --git a/apps/users/forms.py b/apps/users/forms.py
index 06d47f66e..b89b62660 100644
--- a/apps/users/forms.py
+++ b/apps/users/forms.py
@@ -114,10 +114,15 @@ class UserPublicKeyForm(forms.Form):
         return self.instance
 
 
-class UserBulkImportForm(forms.ModelForm):
+# class UserBulkImportForm(forms.ModelForm):
+#     class Meta:
+#         model = User
+#         fields = ['username', 'email', 'enable_otp', 'role']
+
+class UserBulkUpdateForm(forms.ModelForm):
     class Meta:
         model = User
-        fields = ['username', 'email', 'enable_otp', 'role']
+        fields = ['role', 'groups', 'date_expired', 'is_active', 'enable_otp']
 
 
 class UserGroupForm(forms.ModelForm):
diff --git a/apps/users/models/group.py b/apps/users/models/group.py
index 9f479ee81..0c869de42 100644
--- a/apps/users/models/group.py
+++ b/apps/users/models/group.py
@@ -23,6 +23,7 @@ class UserGroup(NoDeleteModelMixin):
 
     def __unicode__(self):
         return self.name
+    __str__ = __unicode__
 
     def delete(self, using=None, keep_parents=False):
         self.group_ptr.delete()
diff --git a/apps/users/templates/users/_user_bulk_update_modal.html b/apps/users/templates/users/_user_bulk_update_modal.html
index 4aae4c180..8b25a7e06 100644
--- a/apps/users/templates/users/_user_bulk_update_modal.html
+++ b/apps/users/templates/users/_user_bulk_update_modal.html
@@ -1,37 +1,37 @@
 {% extends '_modal.html' %}
 {% load i18n %}
+{% load bootstrap3 %}
 {% block modal_id %}user_bulk_update_modal{% endblock %}
-{% block modal_title%}{% trans "Update User" %}{% endblock %}
+{% block modal_class %}modal-lg{% endblock %}
+{% block modal_title%}{% trans "Update selected user" %}{% endblock %}
 {% block modal_body %}
-<p class="text-success text-center">{% trans "Hint: only change the field you want to update." %}</p>
+<div class="ydxbd" id="ydxbd" style="display: block;">
+	<div>
+		<p id="tags_p">
+			<a href="/assets/asset-by-tag/5">
+				<span class="label label-default">三年质保(0)</span>
+			</a>
+            <a href="/assets/asset-by-tag/5">
+                <span class="label label-default">三年质保(0)</span>
+            </a>
+		</p>
+	</div>
+</div>
 <form method="post" class="form-horizontal" action="" id="fm_user_bulk_update">
-    <div class="form-group">
-        <label class="control-label col-sm-2 col-lg-2 " for="id_role">{% trans "Role" %}</label>
-        <div class=" col-sm-9 col-lg-9 ">
-            <select class=" form-control" id="id_role" name="role">
-                <option value="">---------</option>
-                <option value="Admin">{% trans "Admin" %}</option>
-                <option value="User">{% trans "User" %}</option>
-            </select>
-        </div>
-    </div>
-    <div class="form-group">
-        <label for="groups" class="col-sm-2 control-label">{% trans 'Groups' %}</label>
-        <div class="col-sm-9" id="select2-container">
-            <select name="groups" id="select2_groups" data-placeholder="{% trans 'Select groups' %}" class="select2 form-control m-b" multiple>
-                {% for group in groups %}
-                    <option value="{{ group.id }}">{{ group.name }}</option>
-                {% endfor %}
-            </select>
-        </div>
-    </div>
-    <div class="form-group">
-        <div class="col-sm-9 col-lg-9 col-sm-offset-2">
-            <div class="checkbox">
-                <input type="checkbox" name="enable_otp" checked id="id_enable_otp"><label for="id_enable_otp">{% trans 'Enable-OTP' %}</label>
-            </div>
-        </div>
-    </div>
+{#    {% for field in form %}#}
+{#        <input type="checkbox">#}
+{#        {% bootstrap_field field layout='horizontal' %}#}
+{#    {% endfor %}#}
+    {% bootstrap_form form layout='horizontal' %}
+
+{#    <div class="form-group">#}
+{#        <div class="col-sm-9 col-lg-9 col-sm-offset-2">#}
+{#            <div class="checkbox">#}
+{#                <input type="checkbox" name="enable_otp" checked id="id_enable_otp" disabled><label for="id_enable_otp">{% trans 'Enable-OTP' %}</label>#}
+{#            </div>#}
+{#        </div>#}
+{#    </div>#}
 </form>
 {% endblock %}
 {% block modal_confirm_id %}btn_user_bulk_update{% endblock %}
+
diff --git a/apps/users/templates/users/_user_import_modal.html b/apps/users/templates/users/_user_import_modal.html
index 3e56c6a47..1c6179f6a 100644
--- a/apps/users/templates/users/_user_import_modal.html
+++ b/apps/users/templates/users/_user_import_modal.html
@@ -8,11 +8,12 @@
     {% csrf_token %}
     <div class="form-group">
         <label class="control-label" for="id_users">{% trans "Template" %}</label>
-        <a href="{{ MEDIA_URL }}files/user_import_template.xlsx" style="display: block">{% trans 'Download' %}</a>
+        <a href="{% url 'users:user-export' %}" style="display: block">{% trans 'Download' %}</a>
     </div>
     <div class="form-group">
         <label class="control-label" for="id_users">{% trans "Users excel file" %}</label>
         <input id="id_users" type="file" name="file" />
+        <span class="help-block">{% trans 'If set id, will use this id update existed' %}</span>
     </div>
 </form>
 <p>
diff --git a/apps/users/templates/users/user_list.html b/apps/users/templates/users/user_list.html
index f4a353bbd..01bb473f2 100644
--- a/apps/users/templates/users/user_list.html
+++ b/apps/users/templates/users/user_list.html
@@ -55,8 +55,9 @@
 {% block custom_foot_js %}
 <script src="{% static 'js/jquery.form.min.js' %}"></script>
 <script>
-$(document).ready(function(){
-    var options = {
+
+function renderTable() {
+     var options = {
         ele: $('#user_list_table'),
         columnDefs: [
             {targets: 1, createdCell: function (td, cellData, rowData) {
@@ -91,7 +92,13 @@ $(document).ready(function(){
         op_html: $('#actions').html()
     };
     var table = jumpserver.initDataTable(options);
-
+}
+$(document).ready(function(){
+    renderTable();
+    var fields = $('#fm_user_bulk_update .form-group');
+    $.each(fields, function (index, value) {
+        console.log(value)
+    });
     $('.btn_export').click(function () {
         var users = [];
         var rows = table.rows('.selected').data();
@@ -242,7 +249,8 @@ $(document).ready(function(){
         $('#user_list_table').DataTable().ajax.reload();
         jumpserver.checked = false;
     };
-    APIUpdateAttr({url: the_url, method: 'PATCH', body: JSON.stringify(post_list), success: success});
+    console.log(body);
+{#    APIUpdateAttr({url: the_url, method: 'PATCH', body: JSON.stringify(post_list), success: success});#}
     $('#user_bulk_update_modal').modal('hide');
 });
 </script>
diff --git a/apps/users/views/user.py b/apps/users/views/user.py
index f02aec563..7a09353be 100644
--- a/apps/users/views/user.py
+++ b/apps/users/views/user.py
@@ -52,7 +52,8 @@ class UserListView(AdminUserRequiredMixin, TemplateView):
         context.update({
             'app': _('Users'),
             'action': _('User list'),
-            'groups': UserGroup.objects.all()
+            'groups': UserGroup.objects.all(),
+            'form': forms.UserBulkUpdateForm(),
         })
         return context
 
@@ -122,16 +123,16 @@ class UserDetailView(AdminUserRequiredMixin, DetailView):
         return super(UserDetailView, self).get_context_data(**kwargs)
 
 
-USER_ATTR_MAPPING = (
-    ('name', 'Name'),
-    ('username', 'Username'),
-    ('email', 'Email'),
-    ('groups', 'User groups'),
-    ('role', 'Role'),
-    ('phone', 'Phone'),
-    ('wechat', 'Wechat'),
-    ('comment', 'Comment'),
-)
+# USER_ATTR_MAPPING = (
+#     ('name', 'Name'),
+#     ('username', 'Username'),
+#     ('email', 'Email'),
+#     ('groups', 'User groups'),
+#     ('role', 'Role'),
+#     ('phone', 'Phone'),
+#     ('wechat', 'Wechat'),
+#     ('comment', 'Comment'),
+# )
 
 
 @method_decorator(csrf_exempt, name='dispatch')
@@ -208,7 +209,6 @@ class UserBulkImportView(AdminUserRequiredMixin, JSONResponseMixin, FormView):
         mapping_reverse = {field.verbose_name: field.name for field in fields}
         mapping_reverse[_('User groups')] = 'groups'
         attr = [mapping_reverse.get(n, None) for n in header_]
-        print(attr)
         if None in attr:
             data = {'valid': False,
                     'msg': 'Must be same format as '