Skip to content

Commit 0eb59bc

Browse files
authored
Added support for Django 5.2. (#200)
* Confirmed support for Django 5.2. * Added <div> to errors template and moved 'invalid-feedback' to this element. * Added 'aria-describedby' to <fieldset>s.
1 parent 18e44bd commit 0eb59bc

File tree

50 files changed

+555
-118
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+555
-118
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## Next Release
44
* Added Python 3.13 support.
5+
* Added support for Django 5.2. This required the following template changes:
6+
* Added `aria-describedby` to `<fieldset>` elements.
7+
* Added a parent `<div>` for errors to allow them to be referenced by `aria-describedby`. This means error messages can now be read by screen reader users.
58

69
## 2024.10 (2024-10-05)
710
* Added support for Django 5.1.

crispy_bootstrap5/templates/bootstrap5/field.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
{% endif %}
1212
<{% if tag %}{{ tag }}{% else %}div{% endif %} id="div_{{ field.auto_id }}" class="{% if field|is_checkbox and form_show_labels %}form-check{% else %}mb-3{% if 'form-horizontal' in form_class %} row{% endif %}{% endif %}{% if wrapper_class %} {{ wrapper_class }}{% endif %}{% if field.css_classes %} {{ field.css_classes }}{% endif %}">
1313
{% if field.label and not field|is_checkbox and form_show_labels %}
14-
{% if field.use_fieldset %}<fieldset{% if 'form-horizontal' in form_class %} class="row"{% endif %}>{% endif %}
14+
{% if field.use_fieldset %}<fieldset{% if 'form-horizontal' in form_class %} class="row"{% endif %}{% if field.aria_describedby %} aria-describedby="{{ field.aria_describedby }}"{% endif %}>{% endif %}
1515
<{% if field.use_fieldset %}legend{% else %}label{% endif %}
1616
{% if field.id_for_label %}for="{{ field.id_for_label }}"{% endif %} class="{% if 'form-horizontal' in form_class %}col-form-label pt-0{% else %}form-label{% endif %}{% if label_class %} {{ label_class }}{% endif %}{% if field.field.required %} requiredField{% endif %}">
1717
{{ field.label }}{% if field.field.required %}<span class="asteriskField">*</span>{% endif %}

crispy_bootstrap5/templates/bootstrap5/layout/checkboxselectmultiple_inline.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<div id="div_{{ field.auto_id }}" class="mb-3{% if 'form-horizontal' in form_class %} row{% endif %}{% if wrapper_class %} {{ wrapper_class }}{% endif %}{% if field.css_classes %} {{ field.css_classes }}{% endif %}">
55

66
{% if field.label %}
7-
<fieldset{% if 'form-horizontal' in form_class %} class="row"{% endif %}>
7+
<fieldset{% if field.aria_describedby %} aria-describedby="{{ field.aria_describedby }}"{% endif %}{% if 'form-horizontal' in form_class %} class="row"{% endif %}>
88
<legend for="{{ field.id_for_label }}" class="{{ label_class }}{% if 'form-horizontal' in form_class %} col-form-label pt-0{% else %} form-label{% endif %}{% if field.field.required %} requiredField{% endif %}">
99
{{ field.label }}{% if field.field.required %}<span class="asteriskField">*</span>{% endif %}
1010
</legend>
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
{% if form_show_errors and field.errors %}
2+
{% if field.errors.field_id %}
3+
{# Django 5.2+ #}
4+
<div id="{{field.errors.field_id}}_error" class="invalid-feedback">
5+
{% else %}
6+
<div id="{{field.auto_id}}_error" class="invalid-feedback">
7+
{% endif %}
28
{% for error in field.errors %}
3-
<span id="error_{{ forloop.counter }}_{{ field.auto_id }}" class="invalid-feedback"><strong>{{ error }}</strong></span>
9+
<span id="error_{{ forloop.counter }}_{{ field.auto_id }}"><strong>{{ error }}</strong></span>
410
{% endfor %}
11+
</div>
512
{% endif %}
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
{% if form_show_errors and field.errors %}
2+
{% if field.errors.field_id %}
3+
{# Django 5.2+ #}
4+
<div id="{{field.errors.field_id}}_error"class="invalid-feedback">
5+
{% else %}
6+
<div id="{{field.auto_id}}_error" class="invalid-feedback">
7+
{% endif %}
28
{% for error in field.errors %}
3-
<p id="error_{{ forloop.counter }}_{{ field.auto_id }}" class="invalid-feedback"><strong>{{ error }}</strong></p>
9+
<p id="error_{{ forloop.counter }}_{{ field.auto_id }}"><strong>{{ error }}</strong></p>
410
{% endfor %}
11+
</div>
512
{% endif %}

crispy_bootstrap5/templates/bootstrap5/layout/field_with_buttons.html

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,16 @@
2424
{% endif %}
2525
{{ buttons|safe }}
2626
</div>
27-
{% for error in field.errors %}
28-
<p id="error_{{ forloop.counter }}_{{ field.auto_id }}" class="text-danger mb-0"><small><strong>{{ error }}</strong></small></p>
29-
{% endfor %}
27+
{% if field.errors.field_id %}
28+
{# Django 5.2+ #}
29+
<div id="{{field.errors.field_id}}_error">
30+
{% else %}
31+
<div id="{{field.auto_id}}_error">
32+
{% endif %}
33+
{% for error in field.errors %}
34+
<p id="error_{{ forloop.counter }}_{{ field.auto_id }}" class="text-danger mb-0"><small><strong>{{ error }}</strong></small></p>
35+
{% endfor %}
36+
</div>
3037
{% include 'bootstrap5/layout/help_text.html' %}
3138
</div>
3239
</div>
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{% if field.help_text %}
22
{% if help_text_inline %}
3-
<span id="{{ field.id_for_label }}_helptext" class="form-text">{{ field.help_text|safe}}</span>
3+
<span id="{{ field.auto_id }}_helptext" class="form-text">{{ field.help_text|safe}}</span>
44
{% else %}
5-
<div {% if field.id_for_label %}id="{{ field.id_for_label }}_helptext" {% endif %}class="form-text">{{ field.help_text|safe }}</div>
5+
<div {% if field.auto_id %}id="{{ field.auto_id }}_helptext" {% endif %}class="form-text">{{ field.help_text|safe }}</div>
66
{% endif %}
77
{% endif %}

crispy_bootstrap5/templates/bootstrap5/layout/radio_checkbox_select.html

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,15 @@
2020

2121
</div>
2222
{% if field.errors and inline_class %}
23-
{% for error in field.errors %}
24-
<p id="error_{{ forloop.counter }}_{{ field.auto_id }}" class="invalid-feedback"><strong>{{ error }}</strong></p>
25-
{% endfor %}
23+
{% if field.errors.field_id %}
24+
{# Django 5.2+ #}
25+
<div id="{{field.errors.field_id}}_error" class="invalid-feedback">
26+
{% else %}
27+
<div id="{{field.auto_id}}_error" class="invalid-feedback">
28+
{% endif %}
29+
{% for error in field.errors %}
30+
<p id="error_{{ forloop.counter }}_{{ field.auto_id }}"><strong>{{ error }}</strong></p>
31+
{% endfor %}
32+
</div>
2633
{% endif %}
2734
{% include 'bootstrap5/layout/help_text.html' %}

crispy_bootstrap5/templates/bootstrap5/layout/radioselect_inline.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<div id="div_{{ field.auto_id }}" class="mb-3{% if 'form-horizontal' in form_class %} row{% endif %}{% if wrapper_class %} {{ wrapper_class }}{% endif %}{% if field.css_classes %} {{ field.css_classes }}{% endif %}">
55

66
{% if field.label %}
7-
<fieldset{% if 'form-horizontal' in form_class %} class="row"{% endif %}>
7+
<fieldset{% if field.aria_describedby %} aria-describedby="{{ field.aria_describedby }}"{% endif %}{% if 'form-horizontal' in form_class %} class="row"{% endif %}>
88
<legend for="{{ field.id_for_label }}" class="{{ label_class }}{% if 'form-horizontal' in form_class %} col-form-label pt-0{% else %} form-label{% endif %}{% if field.field.required %} requiredField{% endif %}">
99
{{ field.label }}{% if field.field.required %}<span class="asteriskField">*</span>{% endif %}
1010
</legend>

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ classifiers=[
1717
"Framework :: Django :: 4.2",
1818
"Framework :: Django :: 5.0",
1919
"Framework :: Django :: 5.1",
20+
"Framework :: Django :: 5.2",
2021
"License :: OSI Approved :: MIT License",
2122
"Operating System :: OS Independent",
2223
"Programming Language :: Python :: 3 :: Only",

0 commit comments

Comments
 (0)