Browse Source

#6797: Improve form error/django messages handling

checktheroads 4 years ago
parent
commit
0b09365d0d

+ 1 - 1
netbox/netbox/views/generic.py

@@ -854,7 +854,7 @@ class BulkEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
                     return redirect(self.get_return_url(request))
 
                 except ValidationError as e:
-                    messages.error(self.request, "{} failed validation: {}".format(obj, e))
+                    messages.error(self.request, "{} failed validation: {}".format(obj, ", ".join(e.messages)))
 
                 except PermissionsViolation:
                     msg = "Object update failed due to object-level permissions violation"

File diff suppressed because it is too large
+ 0 - 0
netbox/project-static/dist/netbox-dark.css


File diff suppressed because it is too large
+ 0 - 0
netbox/project-static/dist/netbox-light.css


+ 7 - 0
netbox/project-static/styles/netbox.scss

@@ -1062,6 +1062,13 @@ div.card > div.card-header > div.table-controls {
   border-bottom: 1px solid $nav-tabs-border-color;
 }
 
+#django-messages {
+  position: fixed;
+  right: $spacer;
+  bottom: 0;
+  margin: $spacer;
+}
+
 // Page-specific styles.
 html {
   // Shade the home page content background-color.

+ 34 - 33
netbox/templates/inc/messages.html

@@ -1,30 +1,32 @@
 {% load helpers %}
 
-<div id="django-messages" class="toast-container position-fixed bottom-0 end-0 m-3">
+<div id="django-messages" class="toast-container">
   {# Django Messages #}
 
-  {% if messages %}
-    {% for message in messages %}
-      {% with message.level_tag|status_from_tag as status %}
-      {% with status|icon_from_status as icon %}
-        <div class="django-message toast align-items-center border-0 bg-{{ status }}" role="alert" aria-live="assertive" aria-atomic="true" data-bs-delay="10000">
-          <div class="d-flex">
-            <div class="toast-body">
-              <i class="mdi mdi-{{ icon }} me-1"></i>
-              {{ message }}
-            </div>
+  {# Form Field Errors #}
+  {% if form and form.errors %}
+    {% for field in form %}
+      {% for error in field.errors %}
+        <div class="django-message toast align-items-center border-0 bg-danger" data-django-type="field-error" role="alert" aria-live="assertive" aria-atomic="true" data-bs-delay="60000">
+          <div class="toast-header bg-danger">
+            <strong class="me-auto">
+              <i class="mdi mdi-{{ "danger"|icon_from_status }} me-1"></i>
+              {{ field.label }}
+            </strong>
             <button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
           </div>
+          <div class="toast-body">
+            {{ error|escape }}
+          </div>
         </div>
-      {% endwith %}
-      {% endwith %}
+      {% endfor %}
     {% endfor %}
+  {% endif %}
 
-  {% elif form and form.non_field_errors %}
-    {# Non-Field Form Errors #}
-
+  {# Non-Field Form Errors #}
+  {% if form and form.non_field_errors %}
     {% for error in form.non_field_errors.get_json_data %}
-      <div class="django-message toast align-items-center border-0 bg-danger" role="alert" aria-live="assertive" aria-atomic="true" data-bs-delay="10000">
+      <div class="django-message toast align-items-center border-0 bg-danger" data-django-type="non-field-error" role="alert" aria-live="assertive" aria-atomic="true" data-bs-delay="10000">
         <div class="d-flex">
           <div class="toast-body">
             <i class="mdi mdi-{{ "danger"|icon_from_status }} me-1"></i>
@@ -34,26 +36,25 @@
         </div>
       </div>
     {% endfor %}
-  
-  {% elif form and form.errors %}
-    {# Form Field Errors #}
+  {% endif %}
 
-    {% for field in form %}
-      {% for error in field.errors %}
-        <div class="django-message toast align-items-center border-0 bg-danger" role="alert" aria-live="assertive" aria-atomic="true" data-bs-delay="60000">
-          <div class="toast-header bg-danger">
-            <strong class="me-auto">
-              <i class="mdi mdi-{{ "danger"|icon_from_status }} me-1"></i>
-              {{ field.label }}
-            </strong>
+  {# Django Messages #}
+  {% if messages %}
+    {% for message in messages %}
+      {% with message.level_tag|status_from_tag as status %}
+      {% with status|icon_from_status as icon %}
+        <div class="django-message toast align-items-center border-0 bg-{{ status }}" data-django-type="message" role="alert" aria-live="assertive" aria-atomic="true" data-bs-delay="10000">
+          <div class="d-flex">
+            <div class="toast-body">
+              <i class="mdi mdi-{{ icon }} me-1"></i>
+              {{ message }}
+            </div>
             <button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
           </div>
-          <div class="toast-body">
-            {{ error|escape }}
-          </div>
         </div>
-      {% endfor %}
+      {% endwith %}
+      {% endwith %}
     {% endfor %}
-
   {% endif %}
+
 </div>

Some files were not shown because too many files changed in this diff