#6797: Improve form error/django messages handling

This commit is contained in:
checktheroads 2021-08-01 13:30:16 -07:00
parent 8e3ab8d5c5
commit 0b09365d0d
5 changed files with 47 additions and 39 deletions

View File

@ -854,7 +854,7 @@ class BulkEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
return redirect(self.get_return_url(request)) return redirect(self.get_return_url(request))
except ValidationError as e: 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: except PermissionsViolation:
msg = "Object update failed due to object-level permissions violation" msg = "Object update failed due to object-level permissions violation"

Binary file not shown.

Binary file not shown.

View File

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

View File

@ -1,46 +1,13 @@
{% load helpers %} {% 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 #} {# Django Messages #}
{% if messages %} {# Form Field Errors #}
{% for message in messages %} {% if form and form.errors %}
{% 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>
<button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
{% endwith %}
{% endwith %}
{% endfor %}
{% elif form and form.non_field_errors %}
{# Non-Field Form 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="d-flex">
<div class="toast-body">
<i class="mdi mdi-{{ "danger"|icon_from_status }} me-1"></i>
{{ error.message }}
</div>
<button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
{% endfor %}
{% elif form and form.errors %}
{# Form Field Errors #}
{% for field in form %} {% for field in form %}
{% for error in field.errors %} {% 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="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"> <div class="toast-header bg-danger">
<strong class="me-auto"> <strong class="me-auto">
<i class="mdi mdi-{{ "danger"|icon_from_status }} me-1"></i> <i class="mdi mdi-{{ "danger"|icon_from_status }} me-1"></i>
@ -54,6 +21,40 @@
</div> </div>
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{# 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" 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>
{{ error.message }}
</div>
<button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
{% endfor %}
{% endif %}
{# 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>
{% endwith %}
{% endwith %}
{% endfor %}
{% endif %}
</div> </div>