Sfoglia il codice sorgente

Fixes #4239: Fix exception when selecting all filtered objects during bulk edit

Jeremy Stretch 6 anni fa
parent
commit
1c72d75b62

+ 1 - 0
docs/release-notes/version-2.7.md

@@ -10,6 +10,7 @@
 * [#4228](https://github.com/netbox-community/netbox/issues/4228) - Improve fit of device images in rack elevations
 * [#4232](https://github.com/netbox-community/netbox/issues/4232) - Enforce consistent background striping in rack elevations
 * [#4235](https://github.com/netbox-community/netbox/issues/4235) - Fix API representation of `content_type` for export templates
+* [#4239](https://github.com/netbox-community/netbox/issues/4239) - Fix exception when selecting all filtered objects during bulk edit
 
 ---
 

+ 4 - 4
netbox/templates/utilities/obj_list.html

@@ -34,12 +34,12 @@
                             </div>
                             <div class="pull-right">
                                 {% if bulk_edit_url and permissions.change %}
-                                    <button type="submit" name="_edit" formaction="{% url bulk_edit_url %}{% if bulk_querystring %}?{{ bulk_querystring }}{% elif request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="btn btn-warning btn-sm" disabled="disabled">
+                                    <button type="submit" name="_edit" formaction="{% url bulk_edit_url %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="btn btn-warning btn-sm" disabled="disabled">
                                         <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Edit All
                                     </button>
                                 {% endif %}
                                 {% if bulk_delete_url and permissions.delete %}
-                                    <button type="submit" name="_delete" formaction="{% url bulk_delete_url %}{% if bulk_querystring %}?{{ bulk_querystring }}{% elif request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="btn btn-danger btn-sm" disabled="disabled">
+                                    <button type="submit" name="_delete" formaction="{% url bulk_delete_url %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="btn btn-danger btn-sm" disabled="disabled">
                                         <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Delete All
                                     </button>
                                 {% endif %}
@@ -51,12 +51,12 @@
                 <div class="pull-left noprint">
                     {% block bulk_buttons %}{% endblock %}
                     {% if bulk_edit_url and permissions.change %}
-                        <button type="submit" name="_edit" formaction="{% url bulk_edit_url %}" class="btn btn-warning btn-sm">
+                        <button type="submit" name="_edit" formaction="{% url bulk_edit_url %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="btn btn-warning btn-sm">
                             <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Edit Selected
                         </button>
                     {% endif %}
                     {% if bulk_delete_url and permissions.delete %}
-                        <button type="submit" name="_delete" formaction="{% url bulk_delete_url %}" class="btn btn-danger btn-sm">
+                        <button type="submit" name="_delete" formaction="{% url bulk_delete_url %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="btn btn-danger btn-sm">
                             <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Delete Selected
                         </button>
                     {% endif %}

+ 8 - 9
netbox/utilities/views.py

@@ -626,12 +626,13 @@ class BulkEditView(GetReturnURLMixin, View):
 
         model = self.queryset.model
 
-        # Create a mutable copy of the POST data
-        post_data = request.POST.copy()
-
         # If we are editing *all* objects in the queryset, replace the PK list with all matched objects.
-        if post_data.get('_all') and self.filterset is not None:
-            post_data['pk'] = [obj.pk for obj in self.filterset(request.GET, model.objects.only('pk')).qs]
+        if request.POST.get('_all') and self.filterset is not None:
+            pk_list = [
+                obj.pk for obj in self.filterset(request.GET, model.objects.only('pk')).qs
+            ]
+        else:
+            pk_list = request.POST.getlist('pk')
 
         if '_apply' in request.POST:
             form = self.form(model, request.POST)
@@ -715,12 +716,10 @@ class BulkEditView(GetReturnURLMixin, View):
                     messages.error(self.request, "{} failed validation: {}".format(obj, e))
 
         else:
-            # Pass the PK list as initial data to avoid binding the form
-            initial_data = querydict_to_dict(post_data)
-            form = self.form(model, initial=initial_data)
+            form = self.form(model, initial={'pk': pk_list})
 
         # Retrieve objects being edited
-        table = self.table(self.queryset.filter(pk__in=post_data.getlist('pk')), orderable=False)
+        table = self.table(self.queryset.filter(pk__in=pk_list), orderable=False)
         if not table.rows:
             messages.warning(request, "No {} were selected.".format(model._meta.verbose_name_plural))
             return redirect(self.get_return_url(request))