Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-crispy-bootstrap4 for 
openSUSE:Factory checked in at 2024-07-18 19:16:59
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-crispy-bootstrap4 (Old)
 and      /work/SRC/openSUSE:Factory/.python-crispy-bootstrap4.new.17339 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-crispy-bootstrap4"

Thu Jul 18 19:16:59 2024 rev:3 rq:1188228 version:2024.1

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-crispy-bootstrap4/python-crispy-bootstrap4.changes
        2024-03-22 15:35:05.748870873 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-crispy-bootstrap4.new.17339/python-crispy-bootstrap4.changes
     2024-07-18 19:17:08.925046437 +0200
@@ -1,0 +2,12 @@
+Wed Jul 17 14:55:31 UTC 2024 - Markéta Machová <[email protected]>
+
+- Update to 2024.1
+  * Confirmed support for Django 4.2.
+  * Dropped support for Django 3.2, 4.0 and 4.1.
+  * Added support for Django 5.0.
+  * Added support for Python 3.12.
+  * Dropped support for django-crispy-forms 1.x.
+  * Enabled custom-control checkbox inputs when show_form_labels is False.
+- Drop upstreamed no-bs3.patch
+
+-------------------------------------------------------------------

Old:
----
  crispy-bootstrap4-2022.1.tar.gz
  no-bs3.patch

New:
----
  crispy-bootstrap4-2024.1.tar.gz

BETA DEBUG BEGIN:
  Old:  * Enabled custom-control checkbox inputs when show_form_labels is False.
- Drop upstreamed no-bs3.patch
BETA DEBUG END:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-crispy-bootstrap4.spec ++++++
--- /var/tmp/diff_new_pack.FI0rGi/_old  2024-07-18 19:17:09.597073374 +0200
+++ /var/tmp/diff_new_pack.FI0rGi/_new  2024-07-18 19:17:09.601073535 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-crispy-bootstrap4
 #
-# Copyright (c) 2023 SUSE LLC
+# Copyright (c) 2024 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -15,29 +15,28 @@
 # Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
+
 %{?sle15_python_module_pythons}
 Name:           python-crispy-bootstrap4
-Version:        2022.1
+Version:        2024.1
 Release:        0
 Summary:        Bootstrap4 template pack for django-crispy-forms
 License:        MIT
 URL:            https://github.com/django-crispy-forms/crispy-bootstrap4
 Source:         
https://github.com/django-crispy-forms/crispy-bootstrap4/archive/refs/tags/%{version}.tar.gz#/crispy-bootstrap4-%{version}.tar.gz
-#PATCH-FIX-UPSTREAM 
https://github.com/django-crispy-forms/crispy-bootstrap4/commit/eb8e43359b6a9ad2ccadc68e29e54a439e5d321d
 Removed test depedant upon bootstrap3 template pack
-Patch:          no-bs3.patch
-BuildRequires:  python-rpm-macros
 BuildRequires:  %{python_module pip}
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  %{python_module wheel}
+BuildRequires:  python-rpm-macros
 # SECTION test requirements
-BuildRequires:  %{python_module Django >= 3.2}
-BuildRequires:  %{python_module django-crispy-forms >= 1.14.0}
-BuildRequires:  %{python_module pytest}
+BuildRequires:  %{python_module Django >= 4.2}
+BuildRequires:  %{python_module django-crispy-forms >= 2.0}
 BuildRequires:  %{python_module pytest-django}
+BuildRequires:  %{python_module pytest}
 # /SECTION
 BuildRequires:  fdupes
-Requires:       python-Django >= 3.2
-Requires:       python-django-crispy-forms >= 1.14.0
+Requires:       python-Django >= 4.2
+Requires:       python-django-crispy-forms >= 2.0
 BuildArch:      noarch
 %python_subpackages
 

++++++ crispy-bootstrap4-2022.1.tar.gz -> crispy-bootstrap4-2024.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/.github/workflows/publish.yml 
new/crispy-bootstrap4-2024.1/.github/workflows/publish.yml
--- old/crispy-bootstrap4-2022.1/.github/workflows/publish.yml  2022-12-17 
08:25:18.000000000 +0100
+++ new/crispy-bootstrap4-2024.1/.github/workflows/publish.yml  2024-02-27 
07:36:14.000000000 +0100
@@ -12,11 +12,11 @@
     strategy:
       matrix:
         python-version:
-        - '3.7'
         - '3.8'
         - '3.9'
         - '3.10'
         - '3.11'
+        - '3.12'
 
     steps:
     - uses: actions/checkout@v3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crispy-bootstrap4-2022.1/.github/workflows/test.yml 
new/crispy-bootstrap4-2024.1/.github/workflows/test.yml
--- old/crispy-bootstrap4-2022.1/.github/workflows/test.yml     2022-12-17 
08:25:18.000000000 +0100
+++ new/crispy-bootstrap4-2024.1/.github/workflows/test.yml     2024-02-27 
07:36:14.000000000 +0100
@@ -14,11 +14,11 @@
     strategy:
       matrix:
         python-version:
-        - '3.7'
         - '3.8'
         - '3.9'
         - '3.10'
         - '3.11'
+        - '3.12'
 
     steps:
     - uses: actions/checkout@v3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crispy-bootstrap4-2022.1/CHANGELOG.md 
new/crispy-bootstrap4-2024.1/CHANGELOG.md
--- old/crispy-bootstrap4-2022.1/CHANGELOG.md   2022-12-17 08:25:18.000000000 
+0100
+++ new/crispy-bootstrap4-2024.1/CHANGELOG.md   2024-02-27 07:36:14.000000000 
+0100
@@ -1,5 +1,17 @@
 # CHANGELOG FOR CRISPY-BOOTSTRAP4
 
+## 2024.1 (2024-02-27)
+
+* Enabled custom-control checkbox inputs when `show_form_labels` is False.
+
+## 2023.1 (2023-10-16)
+
+* Confirmed support for Django 4.2.
+* Dropped support for Django 3.2, 4.0 and 4.1.
+* Added support for Django 5.0.
+* Added support for Python 3.12.
+* Dropped support for django-crispy-forms 1.x.
+
 ## 2022.1
 
 * Initial release to move the template pack from core crispy-forms to a 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crispy-bootstrap4-2022.1/MANIFEST.in 
new/crispy-bootstrap4-2024.1/MANIFEST.in
--- old/crispy-bootstrap4-2022.1/MANIFEST.in    2022-12-17 08:25:18.000000000 
+0100
+++ new/crispy-bootstrap4-2024.1/MANIFEST.in    2024-02-27 07:36:14.000000000 
+0100
@@ -1,4 +1,9 @@
 include LICENSE
 include MANIFEST.in
 include README.md
-recursive-include crispy_bootstrap4/templates *
\ No newline at end of file
+include CHANGELOG.md
+include tox.ini
+recursive-include crispy_bootstrap4/templates *
+recursive-include requirements *.txt
+recursive-include tests *.html
+recursive-include tests *.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/crispy_bootstrap4/templates/bootstrap4/field.html 
new/crispy-bootstrap4-2024.1/crispy_bootstrap4/templates/bootstrap4/field.html
--- 
old/crispy-bootstrap4-2022.1/crispy_bootstrap4/templates/bootstrap4/field.html  
    2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/crispy_bootstrap4/templates/bootstrap4/field.html  
    2024-02-27 07:36:14.000000000 +0100
@@ -11,7 +11,7 @@
     {% endif %}
     <{% if tag %}{{ tag }}{% else %}div{% endif %} id="div_{{ field.auto_id 
}}" class="{% if not field|is_checkbox %}form-group{% if 'form-horizontal' in 
form_class %} row{% endif %}{% else %}{%if use_custom_control%}{% if tag != 
'td' %}custom-control {%endif%} custom-checkbox{% else %}form-check{% endif 
%}{% endif %}{% if wrapper_class %} {{ wrapper_class }}{% endif %}{% if 
field.css_classes %} {{ field.css_classes }}{% endif %}">
         {% if field.label and not field|is_checkbox and form_show_labels %}
-        {# not field|is_radioselect in row below can be removed once Django 
3.2 is no longer supported #}    
+        {# not field|is_radioselect in row below can be removed once Django 
3.2 is no longer supported #}
         <label {% if field.id_for_label and not field|is_radioselect %}for="{{ 
field.id_for_label }}" {% endif %}class="{% if 'form-horizontal' in form_class 
%}col-form-label {% endif %}{{ label_class }}{% if field.field.required %} 
requiredField{% endif %}">
                 {{ field.label }}{% if field.field.required %}<span 
class="asteriskField">*</span>{% endif %}
             </label>
@@ -26,8 +26,12 @@
         {% endif %}
 
         {% if not field|is_checkboxselectmultiple and not field|is_radioselect 
%}
-            {% if field|is_checkbox and form_show_labels %}
-                {%if use_custom_control%}
+            {% if field|is_checkbox %}
+                {% if use_custom_control %}
+                    {% if tag == 'td' %}
+                        <div class="custom-control custom-checkbox">
+                    {% endif %}
+
                     {% if field.errors %}
                         {% crispy_field field 'class' 'custom-control-input 
is-invalid' %}
                     {% else %}
@@ -41,9 +45,16 @@
                     {% endif %}
                 {% endif %}
                 <label for="{{ field.id_for_label }}" class="{%if 
use_custom_control%}custom-control-label{% else %}form-check-label{% endif %}{% 
if field.field.required %} requiredField{% endif %}">
-                    {{ field.label }}{% if field.field.required %}<span 
class="asteriskField">*</span>{% endif %}
+                    {% if form_show_labels %}
+                        {{ field.label }}{% if field.field.required %}<span 
class="asteriskField">*</span>{% endif %}
+                    {% else %}
+                        &nbsp;
+                    {% endif %}
                 </label>
                 {% include 'bootstrap4/layout/help_text_and_errors.html' %}
+                {% if use_custom_control and tag == 'td' %}
+                    </div>
+                {% endif %}
             {% elif field|is_file and use_custom_control  %}
                 {% include 'bootstrap4/layout/field_file.html' %}
             {% else %}
@@ -55,13 +66,13 @@
                             {% crispy_field field 'class' 'custom-select' %}
                         {% endif %}
                     {% elif field|is_file %}
-                        {% if field.errors %}                 
+                        {% if field.errors %}
                             {% crispy_field field 'class' 'form-control-file 
is-invalid' %}
                         {% else %}
                             {% crispy_field field 'class' 'form-control-file' 
%}
                         {% endif %}
                     {% else %}
-                        {% if field.errors %}                      
+                        {% if field.errors %}
                             {% crispy_field field 'class' 'form-control 
is-invalid' %}
                         {% else %}
                             {% crispy_field field 'class' 'form-control' %}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/crispy_bootstrap4/templates/bootstrap4/layout/checkboxselectmultiple.html
 
new/crispy-bootstrap4-2024.1/crispy_bootstrap4/templates/bootstrap4/layout/checkboxselectmultiple.html
--- 
old/crispy-bootstrap4-2022.1/crispy_bootstrap4/templates/bootstrap4/layout/checkboxselectmultiple.html
      2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/crispy_bootstrap4/templates/bootstrap4/layout/checkboxselectmultiple.html
      2024-02-27 07:36:14.000000000 +0100
@@ -1,7 +1,7 @@
 {% load crispy_forms_filters %}
 {% load l10n %}
 
-<div {% if field_class %}class="{{ field_class }}"{% endif %}{% if flat_attrs 
%} {{ flat_attrs }}{% endif %}>
+<div {% if field_class %}class="{{ field_class }}"{% endif %}>
 
     {% for group, options, index in field|optgroups %}
     {% if group %}<strong>{{ group }}</strong>{% endif %}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/crispy_bootstrap4/templates/bootstrap4/layout/radioselect.html
 
new/crispy-bootstrap4-2024.1/crispy_bootstrap4/templates/bootstrap4/layout/radioselect.html
--- 
old/crispy-bootstrap4-2022.1/crispy_bootstrap4/templates/bootstrap4/layout/radioselect.html
 2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/crispy_bootstrap4/templates/bootstrap4/layout/radioselect.html
 2024-02-27 07:36:14.000000000 +0100
@@ -1,7 +1,7 @@
 {% load crispy_forms_filters %}
 {% load l10n %}
 
-<div {% if field_class %}class="{{ field_class }}"{% endif %}{% if flat_attrs 
%} {{ flat_attrs }}{% endif %}>
+<div {% if field_class %}class="{{ field_class }}"{% endif %}>
 
     {% for group, options, index in field|optgroups %}
     {% if group %}<strong>{{ group }}</strong>{% endif %}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crispy-bootstrap4-2022.1/setup.py 
new/crispy-bootstrap4-2024.1/setup.py
--- old/crispy-bootstrap4-2022.1/setup.py       2022-12-17 08:25:18.000000000 
+0100
+++ new/crispy-bootstrap4-2024.1/setup.py       2024-02-27 07:36:14.000000000 
+0100
@@ -2,7 +2,7 @@
 
 from setuptools import setup
 
-VERSION = "2022.1"
+VERSION = "2024.1"
 
 
 def get_long_description():
@@ -30,22 +30,23 @@
     license="MIT",
     version=VERSION,
     packages=["crispy_bootstrap4"],
-    install_requires=["django-crispy-forms>=1.14.0", "django>=3.2"],
-    python_requires=">=3.7",
+    install_requires=["django-crispy-forms>=2.0", "django>=4.2"],
+    python_requires=">=3.8",
     include_package_data=True,
     classifiers=[
         "Environment :: Web Environment",
+        "Development Status :: 5 - Production/Stable",
         "Framework :: Django",
-        "Framework :: Django :: 3.2",
-        "Framework :: Django :: 4.0",
-        "Framework :: Django :: 4.1",
+        "Framework :: Django :: 4.2",
+        "Framework :: Django :: 5.0",
         "License :: OSI Approved :: MIT License",
         "Operating System :: OS Independent",
         "Programming Language :: Python :: 3",
-        "Programming Language :: Python :: 3.7",
+        "Programming Language :: Python :: 3.8",
         "Programming Language :: Python :: 3.9",
         "Programming Language :: Python :: 3.10",
         "Programming Language :: Python :: 3.11",
+        "Programming Language :: Python :: 3.12",
         "Topic :: Internet :: WWW/HTTP",
         "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
         "Topic :: Software Development :: Libraries :: Python Modules",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_false.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_false.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_false.html
    2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_false.html
    2024-02-27 07:36:14.000000000 +0100
@@ -3,7 +3,8 @@
         <label for="id_email" class=" requiredField"> email<span 
class="asteriskField">*</span> </label>
         <div class="">
             <div class="input-group">
-                <input type="text" name="email" value="invalidemail" 
maxlength="30" class="textinput textInput inputtext form-control is-invalid" 
required id="id_email" />
+                <input type="text" name="email" value="invalidemail" 
maxlength="30" aria-describedby="id_email_helptext" aria-invalid="true"
+                       class="textinput textInput inputtext form-control 
is-invalid" required id="id_email" />
                 <div class="input-group-append"><span 
class="input-group-text">whatever</span></div>
             </div>
             <small id="hint_id_email" class="form-text text-muted">Insert your 
email</small>
@@ -22,6 +23,7 @@
                     class="textinput textInput inputtext form-control 
is-invalid"
                     required
                     id="id_first_name"
+                    aria-invalid="true"
                 />
             </div>
         </div>
@@ -31,7 +33,8 @@
         <div class="">
             <div class="input-group">
                 <div class="input-group-prepend"><span 
class="input-group-text">foo</span></div>
-                <input type="text" name="last_name" value="last_name_too_long" 
maxlength="5" class="textinput textInput inputtext form-control is-invalid" 
required id="id_last_name" />
+                <input type="text" name="last_name" value="last_name_too_long" 
maxlength="5" aria-invalid="true"
+                       class="textinput textInput inputtext form-control 
is-invalid" required id="id_last_name" />
                 <div class="input-group-append"><span 
class="input-group-text">bar</span></div>
             </div>
         </div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_false_lt50.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_false_lt50.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_false_lt50.html
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_false_lt50.html
       2024-02-27 07:36:14.000000000 +0100
@@ -0,0 +1,69 @@
+<form method="post">
+    <div id="div_id_email" class="form-group">
+        <label for="id_email" class=" requiredField"> email<span 
class="asteriskField">*</span> </label>
+        <div class="">
+            <div class="input-group">
+                <input type="text" name="email" value="invalidemail" 
maxlength="30" class="textinput textInput inputtext form-control is-invalid" 
required id="id_email" />
+                <div class="input-group-append"><span 
class="input-group-text">whatever</span></div>
+            </div>
+            <small id="hint_id_email" class="form-text text-muted">Insert your 
email</small>
+        </div>
+    </div>
+    <div id="div_id_first_name" class="form-group">
+        <label for="id_first_name" class=" requiredField">first name<span 
class="asteriskField">*</span> </label>
+        <div class="">
+            <div class="input-group">
+                <div class="input-group-prepend"><span 
class="input-group-text">blabla</span></div>
+                <input
+                    type="text"
+                    name="first_name"
+                    value="first_name_too_long"
+                    maxlength="5"
+                    class="textinput textInput inputtext form-control 
is-invalid"
+                    required
+                    id="id_first_name"
+                />
+            </div>
+        </div>
+    </div>
+    <div id="div_id_last_name" class="form-group">
+        <label for="id_last_name" class=" requiredField">last name<span 
class="asteriskField">*</span> </label>
+        <div class="">
+            <div class="input-group">
+                <div class="input-group-prepend"><span 
class="input-group-text">foo</span></div>
+                <input type="text" name="last_name" value="last_name_too_long" 
maxlength="5" class="textinput textInput inputtext form-control is-invalid" 
required id="id_last_name" />
+                <div class="input-group-append"><span 
class="input-group-text">bar</span></div>
+            </div>
+        </div>
+    </div>
+    <div id="div_id_password1" class="form-group">
+        <label for="id_password1" class=" requiredField">password<span 
class="asteriskField">*</span> </label>
+        <div class="">
+            <div class="input-group">
+                <input type="password" name="password1" maxlength="30" 
class="textinput textInput form-control" required id="id_password1" />
+                <div class="input-group-append"><span 
class="input-group-text">whatever</span></div>
+            </div>
+        </div>
+    </div>
+    <div id="div_id_password2" class="form-group">
+        <label
+            for="id_password2"
+            class=" requiredField"
+        >
+            re-enter password<span class="asteriskField">*</span>
+        </label>
+        <div class="">
+            <div class="input-group">
+                <div class="input-group-prepend"><span 
class="input-group-text">blabla</span></div>
+                <input
+                    type="password"
+                    name="password2"
+                    maxlength="30"
+                    class="textinput textInput form-control"
+                    required
+                    id="id_password2"
+                />
+            </div>
+        </div>
+    </div>
+</form>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_true.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_true.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_true.html
     2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_true.html
     2024-02-27 07:36:14.000000000 +0100
@@ -3,7 +3,8 @@
         <label for="id_email" class=" requiredField"> email<span 
class="asteriskField">*</span> </label>
         <div class="">
             <div class="input-group">
-                <input type="text" name="email" value="invalidemail" 
maxlength="30" class="textinput textInput inputtext form-control is-invalid" 
required id="id_email" />
+                <input type="text" name="email" value="invalidemail" 
maxlength="30" aria-invalid="true" aria-describedby="id_email_helptext"
+                       class="textinput textInput inputtext form-control 
is-invalid" required id="id_email" />
                 <div class="input-group-append"><span 
class="input-group-text">whatever</span></div>
                 <span id="error_1_id_email" 
class="invalid-feedback"><strong>Enter a valid email address.</strong></span>
             </div>
@@ -20,7 +21,8 @@
         <div class="">
             <div class="input-group">
                 <div class="input-group-prepend"><span 
class="input-group-text">blabla</span></div>
-                <input type="text" name="first_name" 
value="first_name_too_long" maxlength="5" class="textinput textInput inputtext 
form-control is-invalid" required id="id_first_name" />
+                <input type="text" name="first_name" 
value="first_name_too_long" maxlength="5" aria-invalid="true"
+                       class="textinput textInput inputtext form-control 
is-invalid" required id="id_first_name" />
                 <span id="error_1_id_first_name" 
class="invalid-feedback"><strong>Ensure this value has at most 5 characters (it 
has 19).</strong></span>
             </div>
         </div>
@@ -38,6 +40,7 @@
                     class="textinput textInput inputtext form-control 
is-invalid"
                     required
                     id="id_last_name"
+                    aria-invalid="true"
                 />
                 <div class="input-group-append"><span 
class="input-group-text">bar</span></div>
                 <span id="error_1_id_last_name" 
class="invalid-feedback"><strong>Ensure this value has at most 5 characters (it 
has 18).</strong></span>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_true_lt50.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_true_lt50.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_true_lt50.html
        1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_true_lt50.html
        2024-02-27 07:36:14.000000000 +0100
@@ -0,0 +1,68 @@
+<form method="post">
+    <div id="div_id_email" class="form-group">
+        <label for="id_email" class=" requiredField"> email<span 
class="asteriskField">*</span> </label>
+        <div class="">
+            <div class="input-group">
+                <input type="text" name="email" value="invalidemail" 
maxlength="30" class="textinput textInput inputtext form-control is-invalid" 
required id="id_email" />
+                <div class="input-group-append"><span 
class="input-group-text">whatever</span></div>
+                <span id="error_1_id_email" 
class="invalid-feedback"><strong>Enter a valid email address.</strong></span>
+            </div>
+            <small id="hint_id_email" class="form-text text-muted">Insert your 
email</small>
+        </div>
+    </div>
+    <div id="div_id_first_name" class="form-group">
+        <label
+            for="id_first_name"
+            class=" requiredField"
+        >
+            first name<span class="asteriskField">*</span>
+        </label>
+        <div class="">
+            <div class="input-group">
+                <div class="input-group-prepend"><span 
class="input-group-text">blabla</span></div>
+                <input type="text" name="first_name" 
value="first_name_too_long" maxlength="5" class="textinput textInput inputtext 
form-control is-invalid" required id="id_first_name" />
+                <span id="error_1_id_first_name" 
class="invalid-feedback"><strong>Ensure this value has at most 5 characters (it 
has 19).</strong></span>
+            </div>
+        </div>
+    </div>
+    <div id="div_id_last_name" class="form-group">
+        <label for="id_last_name" class=" requiredField"> last name<span 
class="asteriskField">*</span> </label>
+        <div class="">
+            <div class="input-group">
+                <div class="input-group-prepend"><span 
class="input-group-text">foo</span></div>
+                <input
+                    type="text"
+                    name="last_name"
+                    value="last_name_too_long"
+                    maxlength="5"
+                    class="textinput textInput inputtext form-control 
is-invalid"
+                    required
+                    id="id_last_name"
+                />
+                <div class="input-group-append"><span 
class="input-group-text">bar</span></div>
+                <span id="error_1_id_last_name" 
class="invalid-feedback"><strong>Ensure this value has at most 5 characters (it 
has 18).</strong></span>
+            </div>
+        </div>
+    </div>
+    <div
+        id="div_id_password1"
+        class="form-group"
+    >
+        <label for="id_password1" class=" requiredField"> password<span 
class="asteriskField">*</span> </label>
+        <div class="">
+            <div class="input-group">
+                <input type="password" name="password1" maxlength="30" 
class="textInput textinput form-control" required id="id_password1" />
+                <div class="input-group-append"><span 
class="input-group-text">whatever</span></div>
+            </div>
+        </div>
+    </div>
+    <div id="div_id_password2" class="form-group">
+        <label for="id_password2" class=" requiredField"> re-enter 
password<span class="asteriskField">*</span> </label>
+        <div class="">
+            <div class="input-group">
+                <div class="input-group-prepend"><span 
class="input-group-text">blabla</span></div>
+                <input type="password" name="password2" maxlength="30" 
class="textInput textinput form-control" required id="id_password2" />
+            </div>
+        </div>
+    </div>
+</form>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_false.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_false.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_false.html
    2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_false.html
    2024-02-27 07:36:14.000000000 +0100
@@ -6,7 +6,7 @@
     </div>
     <div id="div_id_email" class="form-group"> <label for="id_email" class=" 
requiredField"> email<span
                 class="asteriskField">*</span> </label>
-        <div> <input type="text" name="email" maxlength="30"
+        <div> <input type="text" name="email" maxlength="30" 
aria-describedby="id_email_helptext" aria-invalid="true"
                 class="textinput textInput inputtext form-control is-invalid" 
required id="id_email"> <small
                 id="hint_id_email" class="form-text text-muted">Insert your 
email</small> </div>
     </div>
@@ -22,18 +22,19 @@
     </div>
     <div id="div_id_first_name" class="form-group"> <label for="id_first_name" 
class=" requiredField"> first name<span
                 class="asteriskField">*</span> </label>
-        <div> <input type="text" name="first_name" maxlength="5"
+        <div> <input type="text" name="first_name" maxlength="5" 
aria-invalid="true"
                 class="textinput textInput inputtext form-control is-invalid" 
required id="id_first_name"> </div>
     </div>
     <div id="div_id_last_name" class="form-group"> <label for="id_last_name" 
class=" requiredField"> last name<span
                 class="asteriskField">*</span> </label>
-        <div> <input type="text" name="last_name" maxlength="5"
+        <div> <input type="text" name="last_name" maxlength="5" 
aria-invalid="true"
                 class="textinput textInput inputtext form-control is-invalid" 
required id="id_last_name"> </div>
     </div>
     <div id="div_id_datetime_field" class="form-group"> 
         <label class=" requiredField">date time<span 
class="asteriskField">*</span> </label>
         <div> <input type="text" name="datetime_field_0" class="dateinput 
form-control is-invalid" required
-                id="id_datetime_field_0"><input type="text" 
name="datetime_field_1"
-                class="timeinput form-control is-invalid" required 
id="id_datetime_field_1"> </div>
+                id="id_datetime_field_0" aria-invalid="true"><input 
type="text" name="datetime_field_1"
+                aria-invalid="true" class="timeinput form-control is-invalid" 
required id="id_datetime_field_1">
+        </div>
     </div>
 </form>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_false_lt50.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_false_lt50.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_false_lt50.html
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_false_lt50.html
       2024-02-27 07:36:14.000000000 +0100
@@ -0,0 +1,39 @@
+<form method="post">
+    <div class="form-group">
+        <div id="div_id_is_company" class="custom-control  custom-checkbox"> 
<input type="checkbox" name="is_company"
+                class="checkboxinput custom-control-input" id="id_is_company"> 
<label for="id_is_company"
+                class="custom-control-label"> company </label> </div>
+    </div>
+    <div id="div_id_email" class="form-group"> <label for="id_email" class=" 
requiredField"> email<span
+                class="asteriskField">*</span> </label>
+        <div> <input type="text" name="email" maxlength="30"
+                class="textinput textInput inputtext form-control is-invalid" 
required id="id_email"> <small
+                id="hint_id_email" class="form-text text-muted">Insert your 
email</small> </div>
+    </div>
+    <div id="div_id_password1" class="form-group"> <label for="id_password1" 
class=" requiredField"> password<span
+                class="asteriskField">*</span> </label>
+        <div> <input type="password" name="password1" maxlength="30" 
class="textinput textInput form-control" required
+                id="id_password1"> </div>
+    </div>
+    <div id="div_id_password2" class="form-group"> <label for="id_password2" 
class=" requiredField"> re-enter
+            password<span class="asteriskField">*</span> </label>
+        <div> <input type="password" name="password2" maxlength="30" 
class="textinput textInput form-control" required
+                id="id_password2"> </div>
+    </div>
+    <div id="div_id_first_name" class="form-group"> <label for="id_first_name" 
class=" requiredField"> first name<span
+                class="asteriskField">*</span> </label>
+        <div> <input type="text" name="first_name" maxlength="5"
+                class="textinput textInput inputtext form-control is-invalid" 
required id="id_first_name"> </div>
+    </div>
+    <div id="div_id_last_name" class="form-group"> <label for="id_last_name" 
class=" requiredField"> last name<span
+                class="asteriskField">*</span> </label>
+        <div> <input type="text" name="last_name" maxlength="5"
+                class="textinput textInput inputtext form-control is-invalid" 
required id="id_last_name"> </div>
+    </div>
+    <div id="div_id_datetime_field" class="form-group"> 
+        <label class=" requiredField">date time<span 
class="asteriskField">*</span> </label>
+        <div> <input type="text" name="datetime_field_0" class="dateinput 
form-control is-invalid" required
+                id="id_datetime_field_0"><input type="text" 
name="datetime_field_1"
+                class="timeinput form-control is-invalid" required 
id="id_datetime_field_1"> </div>
+    </div>
+</form>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_false_lte40.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_false_lte40.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_false_lte40.html
      2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_false_lte40.html
      1970-01-01 01:00:00.000000000 +0100
@@ -1,39 +0,0 @@
-<form method="post">
-    <div class="form-group">
-        <div id="div_id_is_company" class="custom-control  custom-checkbox"> 
<input type="checkbox" name="is_company"
-                class="checkboxinput custom-control-input" id="id_is_company"> 
<label for="id_is_company"
-                class="custom-control-label"> company </label> </div>
-    </div>
-    <div id="div_id_email" class="form-group"> <label for="id_email" class=" 
requiredField"> email<span
-                class="asteriskField">*</span> </label>
-        <div> <input type="text" name="email" maxlength="30"
-                class="textinput textInput inputtext form-control is-invalid" 
required id="id_email"> <small
-                id="hint_id_email" class="form-text text-muted">Insert your 
email</small> </div>
-    </div>
-    <div id="div_id_password1" class="form-group"> <label for="id_password1" 
class=" requiredField"> password<span
-                class="asteriskField">*</span> </label>
-        <div> <input type="password" name="password1" maxlength="30" 
class="textinput textInput form-control" required
-                id="id_password1"> </div>
-    </div>
-    <div id="div_id_password2" class="form-group"> <label for="id_password2" 
class=" requiredField"> re-enter
-            password<span class="asteriskField">*</span> </label>
-        <div> <input type="password" name="password2" maxlength="30" 
class="textinput textInput form-control" required
-                id="id_password2"> </div>
-    </div>
-    <div id="div_id_first_name" class="form-group"> <label for="id_first_name" 
class=" requiredField"> first name<span
-                class="asteriskField">*</span> </label>
-        <div> <input type="text" name="first_name" maxlength="5"
-                class="textinput textInput inputtext form-control is-invalid" 
required id="id_first_name"> </div>
-    </div>
-    <div id="div_id_last_name" class="form-group"> <label for="id_last_name" 
class=" requiredField"> last name<span
-                class="asteriskField">*</span> </label>
-        <div> <input type="text" name="last_name" maxlength="5"
-                class="textinput textInput inputtext form-control is-invalid" 
required id="id_last_name"> </div>
-    </div>
-    <div id="div_id_datetime_field" class="form-group"> 
-        <label class=" requiredField" for="id_datetime_field_0">date time<span 
class="asteriskField">*</span> </label>
-        <div> <input type="text" name="datetime_field_0" class="dateinput 
form-control is-invalid" required
-                id="id_datetime_field_0"><input type="text" 
name="datetime_field_1"
-                class="timeinput form-control is-invalid" required 
id="id_datetime_field_1"> </div>
-    </div>
-</form>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_true.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_true.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_true.html
     2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_true.html
     2024-02-27 07:36:14.000000000 +0100
@@ -11,7 +11,7 @@
     </div>
     <div id="div_id_email" class="form-group"> <label for="id_email" class=" 
requiredField"> email<span
                 class="asteriskField">*</span> </label>
-        <div> <input type="text" name="email" maxlength="30"
+        <div> <input type="text" name="email" maxlength="30" 
aria-describedby="id_email_helptext" aria-invalid="true"
                 class="textinput textInput inputtext form-control is-invalid" 
required id="id_email"> <span
                 id="error_1_id_email" class="invalid-feedback"><strong>This 
field is required.</strong></span> <small
                 id="hint_id_email" class="form-text text-muted">Insert your 
email</small> </div>
@@ -28,14 +28,14 @@
     </div>
     <div id="div_id_first_name" class="form-group"> <label for="id_first_name" 
class=" requiredField"> first name<span
                 class="asteriskField">*</span> </label>
-        <div> <input type="text" name="first_name" maxlength="5"
+        <div> <input type="text" name="first_name" maxlength="5"  
aria-invalid="true"
                 class="textinput textInput inputtext form-control is-invalid" 
required id="id_first_name"> <span
                 id="error_1_id_first_name" 
class="invalid-feedback"><strong>This field is required.</strong></span>
         </div>
     </div>
     <div id="div_id_last_name" class="form-group"> <label for="id_last_name" 
class=" requiredField"> last name<span
                 class="asteriskField">*</span> </label>
-        <div> <input type="text" name="last_name" maxlength="5"
+        <div> <input type="text" name="last_name" maxlength="5" 
aria-invalid="true"
                 class="textinput textInput inputtext form-control is-invalid" 
required id="id_last_name"> <span
                 id="error_1_id_last_name" 
class="invalid-feedback"><strong>This field is required.</strong></span>
         </div>
@@ -43,7 +43,7 @@
     <div id="div_id_datetime_field" class="form-group"> 
         <label class=" requiredField">date time<span 
class="asteriskField">*</span> </label>
         <div> <input type="text" name="datetime_field_0" class="dateinput 
form-control is-invalid" required
-                id="id_datetime_field_0"><input type="text" 
name="datetime_field_1"
+                id="id_datetime_field_0" aria-invalid="true"><input 
type="text" name="datetime_field_1" aria-invalid="true"
                 class="timeinput form-control is-invalid" required 
id="id_datetime_field_1"> <span
                 id="error_1_id_datetime_field" 
class="invalid-feedback"><strong>This field is required.</strong></span>
         </div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_true_lt50.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_true_lt50.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_true_lt50.html
        1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_true_lt50.html
        2024-02-27 07:36:14.000000000 +0100
@@ -0,0 +1,51 @@
+<form method="post">
+    <div class="alert alert-block alert-danger">
+        <ul class="m-0">
+            <li>Passwords dont match</li>
+        </ul>
+    </div>
+    <div class="form-group">
+        <div id="div_id_is_company" class="custom-control  custom-checkbox"> 
<input type="checkbox" name="is_company"
+                class="checkboxinput custom-control-input" id="id_is_company"> 
<label for="id_is_company"
+                class="custom-control-label"> company </label> </div>
+    </div>
+    <div id="div_id_email" class="form-group"> <label for="id_email" class=" 
requiredField"> email<span
+                class="asteriskField">*</span> </label>
+        <div> <input type="text" name="email" maxlength="30"
+                class="textinput textInput inputtext form-control is-invalid" 
required id="id_email"> <span
+                id="error_1_id_email" class="invalid-feedback"><strong>This 
field is required.</strong></span> <small
+                id="hint_id_email" class="form-text text-muted">Insert your 
email</small> </div>
+    </div>
+    <div id="div_id_password1" class="form-group"> <label for="id_password1" 
class=" requiredField"> password<span
+                class="asteriskField">*</span> </label>
+        <div> <input type="password" name="password1" maxlength="30" 
class="textinput textInput form-control" required
+                id="id_password1"> </div>
+    </div>
+    <div id="div_id_password2" class="form-group"> <label for="id_password2" 
class=" requiredField"> re-enter
+            password<span class="asteriskField">*</span> </label>
+        <div> <input type="password" name="password2" maxlength="30" 
class="textinput textInput form-control" required
+                id="id_password2"> </div>
+    </div>
+    <div id="div_id_first_name" class="form-group"> <label for="id_first_name" 
class=" requiredField"> first name<span
+                class="asteriskField">*</span> </label>
+        <div> <input type="text" name="first_name" maxlength="5"
+                class="textinput textInput inputtext form-control is-invalid" 
required id="id_first_name"> <span
+                id="error_1_id_first_name" 
class="invalid-feedback"><strong>This field is required.</strong></span>
+        </div>
+    </div>
+    <div id="div_id_last_name" class="form-group"> <label for="id_last_name" 
class=" requiredField"> last name<span
+                class="asteriskField">*</span> </label>
+        <div> <input type="text" name="last_name" maxlength="5"
+                class="textinput textInput inputtext form-control is-invalid" 
required id="id_last_name"> <span
+                id="error_1_id_last_name" 
class="invalid-feedback"><strong>This field is required.</strong></span>
+        </div>
+    </div>
+    <div id="div_id_datetime_field" class="form-group"> 
+        <label class=" requiredField">date time<span 
class="asteriskField">*</span> </label>
+        <div> <input type="text" name="datetime_field_0" class="dateinput 
form-control is-invalid" required
+                id="id_datetime_field_0"><input type="text" 
name="datetime_field_1"
+                class="timeinput form-control is-invalid" required 
id="id_datetime_field_1"> <span
+                id="error_1_id_datetime_field" 
class="invalid-feedback"><strong>This field is required.</strong></span>
+        </div>
+    </div>
+</form>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_true_lte40.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_true_lte40.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_true_lte40.html
       2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_form_helper/test_form_show_errors_non_field_errors_true_lte40.html
       1970-01-01 01:00:00.000000000 +0100
@@ -1,51 +0,0 @@
-<form method="post">
-    <div class="alert alert-block alert-danger">
-        <ul class="m-0">
-            <li>Passwords dont match</li>
-        </ul>
-    </div>
-    <div class="form-group">
-        <div id="div_id_is_company" class="custom-control  custom-checkbox"> 
<input type="checkbox" name="is_company"
-                class="checkboxinput custom-control-input" id="id_is_company"> 
<label for="id_is_company"
-                class="custom-control-label"> company </label> </div>
-    </div>
-    <div id="div_id_email" class="form-group"> <label for="id_email" class=" 
requiredField"> email<span
-                class="asteriskField">*</span> </label>
-        <div> <input type="text" name="email" maxlength="30"
-                class="textinput textInput inputtext form-control is-invalid" 
required id="id_email"> <span
-                id="error_1_id_email" class="invalid-feedback"><strong>This 
field is required.</strong></span> <small
-                id="hint_id_email" class="form-text text-muted">Insert your 
email</small> </div>
-    </div>
-    <div id="div_id_password1" class="form-group"> <label for="id_password1" 
class=" requiredField"> password<span
-                class="asteriskField">*</span> </label>
-        <div> <input type="password" name="password1" maxlength="30" 
class="textinput textInput form-control" required
-                id="id_password1"> </div>
-    </div>
-    <div id="div_id_password2" class="form-group"> <label for="id_password2" 
class=" requiredField"> re-enter
-            password<span class="asteriskField">*</span> </label>
-        <div> <input type="password" name="password2" maxlength="30" 
class="textinput textInput form-control" required
-                id="id_password2"> </div>
-    </div>
-    <div id="div_id_first_name" class="form-group"> <label for="id_first_name" 
class=" requiredField"> first name<span
-                class="asteriskField">*</span> </label>
-        <div> <input type="text" name="first_name" maxlength="5"
-                class="textinput textInput inputtext form-control is-invalid" 
required id="id_first_name"> <span
-                id="error_1_id_first_name" 
class="invalid-feedback"><strong>This field is required.</strong></span>
-        </div>
-    </div>
-    <div id="div_id_last_name" class="form-group"> <label for="id_last_name" 
class=" requiredField"> last name<span
-                class="asteriskField">*</span> </label>
-        <div> <input type="text" name="last_name" maxlength="5"
-                class="textinput textInput inputtext form-control is-invalid" 
required id="id_last_name"> <span
-                id="error_1_id_last_name" 
class="invalid-feedback"><strong>This field is required.</strong></span>
-        </div>
-    </div>
-    <div id="div_id_datetime_field" class="form-group"> 
-        <label class=" requiredField" for="id_datetime_field_0">date time<span 
class="asteriskField">*</span> </label>
-        <div> <input type="text" name="datetime_field_0" class="dateinput 
form-control is-invalid" required
-                id="id_datetime_field_0"><input type="text" 
name="datetime_field_1"
-                class="timeinput form-control is-invalid" required 
id="id_datetime_field_1"> <span
-                id="error_1_id_datetime_field" 
class="invalid-feedback"><strong>This field is required.</strong></span>
-        </div>
-    </div>
-</form>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout/test_fundamentals_example.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout/test_fundamentals_example.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout/test_fundamentals_example.html
    2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout/test_fundamentals_example.html
    2024-02-27 07:36:14.000000000 +0100
@@ -2,7 +2,7 @@
     <input type="hidden" name="csrfmiddlewaretoken" value="NotARealToken"> 
     <div id="div_id_like_website" class="form-group">
         <label class=" requiredField"> Do you like this website?<span 
class="asteriskField">*</span> </label>
-        <div action="submit_survey" class="blueForms" id="id-exampleForm">
+        <div>
             <div class="custom-control custom-radio">
                 <input type="radio" class="custom-control-input" 
name="like_website" value="1" id="id_like_website_0" required checked /> <label 
class="custom-control-label" for="id_like_website_0"> Yes </label>
             </div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout/test_inline_formset_checkbox.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout/test_inline_formset_checkbox.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout/test_inline_formset_checkbox.html
 2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout/test_inline_formset_checkbox.html
 2024-02-27 07:36:14.000000000 +0100
@@ -21,17 +21,19 @@
         <tr class="d-none empty-form">
             <div class="form-group">
                 <td id="div_id_form-__prefix__-box_one" 
class="custom-checkbox">
-                    <div>
-                        <input type="checkbox" name="form-__prefix__-box_one" 
class="checkboxinput form-control"
-                               id="id_form-__prefix__-box_one">
+                    <div class="custom-control custom-checkbox">
+                        <input type="checkbox" name="form-__prefix__-box_one" 
class="checkboxinput custom-control-input"
+                                id="id_form-__prefix__-box_one">
+                        <label for="id_form-__prefix__-box_one" 
class="custom-control-label requiredField">&nbsp;</label>
                     </div>
                 </td>
             </div>
             <div class="form-group">
                 <td id="div_id_form-__prefix__-box_two" 
class="custom-checkbox">
-                    <div>
-                        <input type="checkbox" name="form-__prefix__-box_two" 
class="checkboxinput form-control"
-                               id="id_form-__prefix__-box_two">
+                    <div class="custom-control custom-checkbox">
+                        <input type="checkbox" name="form-__prefix__-box_two" 
class="checkboxinput custom-control-input"
+                                id="id_form-__prefix__-box_two">
+                        <label for="id_form-__prefix__-box_two" 
class="custom-control-label requiredField">&nbsp;</label>
                     </div>
                 </td>
             </div>
@@ -39,17 +41,19 @@
         <tr>
             <div class="form-group">
                 <td id="div_id_form-0-box_one" class="custom-checkbox">
-                    <div>
-                        <input type="checkbox" name="form-0-box_one" 
class="checkboxinput form-control"
-                               id="id_form-0-box_one">
+                    <div class="custom-control custom-checkbox">
+                        <input type="checkbox" name="form-0-box_one" 
class="checkboxinput custom-control-input"
+                                id="id_form-0-box_one">
+                        <label for="id_form-0-box_one" 
class="custom-control-label requiredField">&nbsp;</label>
                     </div>
                 </td>
             </div>
             <div class="form-group">
                 <td id="div_id_form-0-box_two" class="custom-checkbox">
-                    <div>
-                        <input type="checkbox" name="form-0-box_two" 
class="checkboxinput form-control"
-                               id="id_form-0-box_two">
+                    <div class="custom-control custom-checkbox">
+                        <input type="checkbox" name="form-0-box_two" 
class="checkboxinput custom-control-input"
+                                id="id_form-0-box_two">
+                        <label for="id_form-0-box_two" 
class="custom-control-label requiredField">&nbsp;</label>
                     </div>
                 </td>
             </div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_checkboxes_true_failing.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_checkboxes_true_failing.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_checkboxes_true_failing.html
   2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_checkboxes_true_failing.html
   2024-02-27 07:36:14.000000000 +0100
@@ -3,13 +3,13 @@
                 class="asteriskField">*</span></label>
         <div>
             <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid" id="id_checkboxes_0"
-                    name="checkboxes" type="checkbox" value="1"><label 
class="custom-control-label"
+                    name="checkboxes" type="checkbox" value="1" 
aria-invalid="true"><label class="custom-control-label"
                     for="id_checkboxes_0">Option one</label></div>
             <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid" id="id_checkboxes_1"
-                    name="checkboxes" type="checkbox" value="2"><label 
class="custom-control-label"
+                    name="checkboxes" type="checkbox" value="2" 
aria-invalid="true"><label class="custom-control-label"
                     for="id_checkboxes_1">Option two</label></div>
             <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid" id="id_checkboxes_2"
-                    name="checkboxes" type="checkbox" value="3"><label 
class="custom-control-label"
+                    name="checkboxes" type="checkbox" value="3" 
aria-invalid="true"><label class="custom-control-label"
                     for="id_checkboxes_2">Option three</label>
             <p class="invalid-feedback" id="error_1_id_checkboxes">
                <strong>This field is required.</strong> 
@@ -21,13 +21,13 @@
                 class="asteriskField">*</span></label>
         <div>
             <div class="custom-checkbox custom-control 
custom-control-inline"><input class="custom-control-input is-invalid"
-                    id="id_alphacheckboxes_0" name="alphacheckboxes" 
type="checkbox" value="option_one"><label
+                    id="id_alphacheckboxes_0" name="alphacheckboxes" 
type="checkbox" value="option_one" aria-invalid="true"><label
                     class="custom-control-label" 
for="id_alphacheckboxes_0">Option one</label></div>
-            <div class="custom-checkbox custom-control 
custom-control-inline"><input
+            <div class="custom-checkbox custom-control 
custom-control-inline"><input aria-invalid="true"
                     class="custom-control-input is-invalid" 
id="id_alphacheckboxes_1" name="alphacheckboxes" type="checkbox"
                     value="option_two"><label class="custom-control-label" 
for="id_alphacheckboxes_1">Option two</label>
             </div>
-            <div class="custom-checkbox custom-control 
custom-control-inline"><input
+            <div class="custom-checkbox custom-control 
custom-control-inline"><input aria-invalid="true"
                     class="custom-control-input is-invalid" 
id="id_alphacheckboxes_2" name="alphacheckboxes" type="checkbox"
                     value="option_three"><label class="custom-control-label" 
for="id_alphacheckboxes_2">Option
                     three</label>
@@ -45,15 +45,15 @@
         <div>
             <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
                     id="id_numeric_multiple_checkboxes_0" 
name="numeric_multiple_checkboxes" type="checkbox"
-                    value="1"><label class="custom-control-label" 
for="id_numeric_multiple_checkboxes_0">Option
+                    value="1" aria-invalid="true"><label 
class="custom-control-label" for="id_numeric_multiple_checkboxes_0">Option
                     one</label></div>
             <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
                     id="id_numeric_multiple_checkboxes_1" 
name="numeric_multiple_checkboxes" type="checkbox"
-                    value="2"><label class="custom-control-label" 
for="id_numeric_multiple_checkboxes_1">Option
+                    value="2" aria-invalid="true"><label 
class="custom-control-label" for="id_numeric_multiple_checkboxes_1">Option
                     two</label></div>
             <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
                     id="id_numeric_multiple_checkboxes_2" 
name="numeric_multiple_checkboxes" type="checkbox"
-                    value="3"><label class="custom-control-label" 
for="id_numeric_multiple_checkboxes_2">Option
+                    value="3" aria-invalid="true"><label 
class="custom-control-label" for="id_numeric_multiple_checkboxes_2">Option
                     three</label>
             <p class="invalid-feedback" 
id="error_1_id_numeric_multiple_checkboxes">
                <strong>This field is required.</strong> 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_checkboxes_true_failing_lt50.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_checkboxes_true_failing_lt50.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_checkboxes_true_failing_lt50.html
      1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_checkboxes_true_failing_lt50.html
      2024-02-27 07:36:14.000000000 +0100
@@ -0,0 +1,64 @@
+<form method="post">
+    <div class="form-group" id="div_id_checkboxes"><label class=" 
requiredField">Checkboxes<span
+                class="asteriskField">*</span></label>
+        <div>
+            <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid" id="id_checkboxes_0"
+                    name="checkboxes" type="checkbox" value="1"><label 
class="custom-control-label"
+                    for="id_checkboxes_0">Option one</label></div>
+            <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid" id="id_checkboxes_1"
+                    name="checkboxes" type="checkbox" value="2"><label 
class="custom-control-label"
+                    for="id_checkboxes_1">Option two</label></div>
+            <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid" id="id_checkboxes_2"
+                    name="checkboxes" type="checkbox" value="3"><label 
class="custom-control-label"
+                    for="id_checkboxes_2">Option three</label>
+            <p class="invalid-feedback" id="error_1_id_checkboxes">
+               <strong>This field is required.</strong> 
+            </p>
+            </div>
+        </div>
+    </div>
+    <div class="form-group" id="div_id_alphacheckboxes"><label class=" 
requiredField">Alphacheckboxes<span
+                class="asteriskField">*</span></label>
+        <div>
+            <div class="custom-checkbox custom-control 
custom-control-inline"><input class="custom-control-input is-invalid"
+                    id="id_alphacheckboxes_0" name="alphacheckboxes" 
type="checkbox" value="option_one"><label
+                    class="custom-control-label" 
for="id_alphacheckboxes_0">Option one</label></div>
+            <div class="custom-checkbox custom-control 
custom-control-inline"><input
+                    class="custom-control-input is-invalid" 
id="id_alphacheckboxes_1" name="alphacheckboxes" type="checkbox"
+                    value="option_two"><label class="custom-control-label" 
for="id_alphacheckboxes_1">Option two</label>
+            </div>
+            <div class="custom-checkbox custom-control 
custom-control-inline"><input
+                    class="custom-control-input is-invalid" 
id="id_alphacheckboxes_2" name="alphacheckboxes" type="checkbox"
+                    value="option_three"><label class="custom-control-label" 
for="id_alphacheckboxes_2">Option
+                    three</label>
+            </div>
+            <div class="custom-checkbox custom-control custom-control-inline 
w-100">
+                <input class="custom-control-input is-invalid" type="checkbox">
+                <p class="invalid-feedback" id="error_1_id_alphacheckboxes">
+                   <strong>This field is required.</strong> 
+                </p>
+            </div>
+        </div>
+    </div>
+    <div class="form-group" id="div_id_numeric_multiple_checkboxes"><label 
class=" requiredField">Numeric multiple
+            checkboxes<span class="asteriskField">*</span></label>
+        <div>
+            <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
+                    id="id_numeric_multiple_checkboxes_0" 
name="numeric_multiple_checkboxes" type="checkbox"
+                    value="1"><label class="custom-control-label" 
for="id_numeric_multiple_checkboxes_0">Option
+                    one</label></div>
+            <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
+                    id="id_numeric_multiple_checkboxes_1" 
name="numeric_multiple_checkboxes" type="checkbox"
+                    value="2"><label class="custom-control-label" 
for="id_numeric_multiple_checkboxes_1">Option
+                    two</label></div>
+            <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
+                    id="id_numeric_multiple_checkboxes_2" 
name="numeric_multiple_checkboxes" type="checkbox"
+                    value="3"><label class="custom-control-label" 
for="id_numeric_multiple_checkboxes_2">Option
+                    three</label>
+            <p class="invalid-feedback" 
id="error_1_id_numeric_multiple_checkboxes">
+               <strong>This field is required.</strong> 
+            </p>
+            </div>
+        </div>
+    </div>
+</form>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_radio_true_failing.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_radio_true_failing.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_radio_true_failing.html
        2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_radio_true_failing.html
        2024-02-27 07:36:14.000000000 +0100
@@ -3,13 +3,13 @@
             select<span class="asteriskField">*</span></label>
         <div>
             <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_select_0"
-                    name="radio_select" type="radio" value="1" required><label 
class="custom-control-label"
+                    name="radio_select" type="radio" value="1" required 
aria-invalid="true"><label class="custom-control-label"
                     for="id_radio_select_0">1</label></div>
             <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_select_1"
-                    name="radio_select" type="radio" value="2" required><label 
class="custom-control-label"
+                    name="radio_select" type="radio" value="2" required 
aria-invalid="true"><label class="custom-control-label"
                     for="id_radio_select_1">2</label></div>
             <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_select_2"
-                    name="radio_select" type="radio" value="1000" 
required><label class="custom-control-label"
+                    name="radio_select" type="radio" value="1000" required 
aria-invalid="true"><label class="custom-control-label"
                     for="id_radio_select_2">1000</label>
             <p class="invalid-feedback" id="error_1_id_radio_select">
                <strong>This field is required.</strong> 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_radio_true_failing_lt50.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_radio_true_failing_lt50.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_radio_true_failing_lt50.html
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout/test_use_custom_control_is_used_in_radio_true_failing_lt50.html
   2024-02-27 07:36:14.000000000 +0100
@@ -0,0 +1,20 @@
+<form method="post">
+    <div class="form-group" id="div_id_radio_select"><label class=" 
requiredField">Radio
+            select<span class="asteriskField">*</span></label>
+        <div>
+            <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_select_0"
+                    name="radio_select" type="radio" value="1" required><label 
class="custom-control-label"
+                    for="id_radio_select_0">1</label></div>
+            <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_select_1"
+                    name="radio_select" type="radio" value="2" required><label 
class="custom-control-label"
+                    for="id_radio_select_1">2</label></div>
+            <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_select_2"
+                    name="radio_select" type="radio" value="1000" 
required><label class="custom-control-label"
+                    for="id_radio_select_2">1000</label>
+            <p class="invalid-feedback" id="error_1_id_radio_select">
+               <strong>This field is required.</strong> 
+            </p>
+            </div>
+        </div>
+    </div>
+</form>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout_objects/test_grouped_checkboxes_failing.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout_objects/test_grouped_checkboxes_failing.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout_objects/test_grouped_checkboxes_failing.html
      2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout_objects/test_grouped_checkboxes_failing.html
      2024-02-27 07:36:14.000000000 +0100
@@ -6,24 +6,24 @@
             <strong>Audio</strong>
             <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
                     id="id_checkbox_select_multiple_0_0" 
name="checkbox_select_multiple" type="checkbox"
-                    value="vinyl"><label class="custom-control-label"
+                    value="vinyl" aria-invalid="true"><label 
class="custom-control-label"
                     for="id_checkbox_select_multiple_0_0">Vinyl</label></div>
             <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
                     id="id_checkbox_select_multiple_0_1" 
name="checkbox_select_multiple" type="checkbox"
-                    value="cd"><label class="custom-control-label" 
for="id_checkbox_select_multiple_0_1">CD</label>
+                    value="cd" aria-invalid="true"><label 
class="custom-control-label" for="id_checkbox_select_multiple_0_1">CD</label>
             </div>
             <strong>Video</strong>
             <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
                     id="id_checkbox_select_multiple_1_0" 
name="checkbox_select_multiple" type="checkbox"
-                    value="vhs"><label class="custom-control-label" 
for="id_checkbox_select_multiple_1_0">VHS
+                    value="vhs" aria-invalid="true"><label 
class="custom-control-label" for="id_checkbox_select_multiple_1_0">VHS
                     Tape</label></div>
             <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
                     id="id_checkbox_select_multiple_1_1" 
name="checkbox_select_multiple" type="checkbox"
-                    value="dvd"><label class="custom-control-label" 
for="id_checkbox_select_multiple_1_1">DVD</label>
+                    value="dvd" aria-invalid="true"><label 
class="custom-control-label" for="id_checkbox_select_multiple_1_1">DVD</label>
             </div>
             <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
                     id="id_checkbox_select_multiple_2" 
name="checkbox_select_multiple" type="checkbox"
-                    value="unknown"><label class="custom-control-label"
+                    value="unknown" aria-invalid="true"><label 
class="custom-control-label"
                     for="id_checkbox_select_multiple_2">Unknown</label>
             <p class="invalid-feedback" 
id="error_1_id_checkbox_select_multiple">
                 <strong>This field is required.</strong>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout_objects/test_grouped_checkboxes_failing_lt50.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout_objects/test_grouped_checkboxes_failing_lt50.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout_objects/test_grouped_checkboxes_failing_lt50.html
 1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout_objects/test_grouped_checkboxes_failing_lt50.html
 2024-02-27 07:36:14.000000000 +0100
@@ -0,0 +1,34 @@
+
+<form method="post">
+    <div class="form-group" id="div_id_checkbox_select_multiple"><label 
class=" requiredField">Checkbox select
+            multiple<span class="asteriskField">*</span></label>
+        <div>
+            <strong>Audio</strong>
+            <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
+                    id="id_checkbox_select_multiple_0_0" 
name="checkbox_select_multiple" type="checkbox"
+                    value="vinyl"><label class="custom-control-label"
+                    for="id_checkbox_select_multiple_0_0">Vinyl</label></div>
+            <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
+                    id="id_checkbox_select_multiple_0_1" 
name="checkbox_select_multiple" type="checkbox"
+                    value="cd"><label class="custom-control-label" 
for="id_checkbox_select_multiple_0_1">CD</label>
+            </div>
+            <strong>Video</strong>
+            <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
+                    id="id_checkbox_select_multiple_1_0" 
name="checkbox_select_multiple" type="checkbox"
+                    value="vhs"><label class="custom-control-label" 
for="id_checkbox_select_multiple_1_0">VHS
+                    Tape</label></div>
+            <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
+                    id="id_checkbox_select_multiple_1_1" 
name="checkbox_select_multiple" type="checkbox"
+                    value="dvd"><label class="custom-control-label" 
for="id_checkbox_select_multiple_1_1">DVD</label>
+            </div>
+            <div class="custom-checkbox custom-control"><input 
class="custom-control-input is-invalid"
+                    id="id_checkbox_select_multiple_2" 
name="checkbox_select_multiple" type="checkbox"
+                    value="unknown"><label class="custom-control-label"
+                    for="id_checkbox_select_multiple_2">Unknown</label>
+            <p class="invalid-feedback" 
id="error_1_id_checkbox_select_multiple">
+                <strong>This field is required.</strong>
+            </p>
+            </div>
+        </div>
+    </div>
+</form>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout_objects/test_grouped_radios_failing.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout_objects/test_grouped_radios_failing.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout_objects/test_grouped_radios_failing.html
  2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout_objects/test_grouped_radios_failing.html
  2024-02-27 07:36:14.000000000 +0100
@@ -4,20 +4,20 @@
         <div>
             <strong>Audio</strong>
             <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_0_0" name="radio"
-                    required type="radio" value="vinyl"><label 
class="custom-control-label"
+                    required type="radio" value="vinyl" 
aria-invalid="true"><label class="custom-control-label"
                     for="id_radio_0_0">Vinyl</label></div>
             <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_0_1" name="radio"
-                    required type="radio" value="cd"><label 
class="custom-control-label" for="id_radio_0_1">CD</label>
+                    required type="radio" value="cd" 
aria-invalid="true"><label class="custom-control-label" 
for="id_radio_0_1">CD</label>
             </div>
             <strong>Video</strong>
             <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_1_0" name="radio"
-                    required type="radio" value="vhs"><label 
class="custom-control-label" for="id_radio_1_0">VHS
+                    required type="radio" value="vhs" 
aria-invalid="true"><label class="custom-control-label" for="id_radio_1_0">VHS
                     Tape</label></div>
             <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_1_1" name="radio"
-                    required type="radio" value="dvd"><label 
class="custom-control-label" for="id_radio_1_1">DVD</label>
+                    required type="radio" value="dvd" 
aria-invalid="true"><label class="custom-control-label" 
for="id_radio_1_1">DVD</label>
             </div>
             <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_2" name="radio"
-                    required type="radio" value="unknown"><label 
class="custom-control-label"
+                    required type="radio" value="unknown" 
aria-invalid="true"><label class="custom-control-label"
                     for="id_radio_2">Unknown</label>
             <p class="invalid-feedback" id="error_1_id_radio">
                 <strong>This field is required.</strong>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout_objects/test_grouped_radios_failing_lt50.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout_objects/test_grouped_radios_failing_lt50.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout_objects/test_grouped_radios_failing_lt50.html
     1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout_objects/test_grouped_radios_failing_lt50.html
     2024-02-27 07:36:14.000000000 +0100
@@ -0,0 +1,28 @@
+<form method="post">
+    <div class="form-group" id="div_id_radio"><label class=" 
requiredField">Radio<span
+                class="asteriskField">*</span></label>
+        <div>
+            <strong>Audio</strong>
+            <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_0_0" name="radio"
+                    required type="radio" value="vinyl"><label 
class="custom-control-label"
+                    for="id_radio_0_0">Vinyl</label></div>
+            <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_0_1" name="radio"
+                    required type="radio" value="cd"><label 
class="custom-control-label" for="id_radio_0_1">CD</label>
+            </div>
+            <strong>Video</strong>
+            <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_1_0" name="radio"
+                    required type="radio" value="vhs"><label 
class="custom-control-label" for="id_radio_1_0">VHS
+                    Tape</label></div>
+            <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_1_1" name="radio"
+                    required type="radio" value="dvd"><label 
class="custom-control-label" for="id_radio_1_1">DVD</label>
+            </div>
+            <div class="custom-control custom-radio"><input 
class="custom-control-input is-invalid" id="id_radio_2" name="radio"
+                    required type="radio" value="unknown"><label 
class="custom-control-label"
+                    for="id_radio_2">Unknown</label>
+            <p class="invalid-feedback" id="error_1_id_radio">
+                <strong>This field is required.</strong>
+            </p>
+            </div>
+        </div>
+    </div>
+</form>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout_objects/test_prepended_appended_text.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout_objects/test_prepended_appended_text.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout_objects/test_prepended_appended_text.html
 2022-12-17 08:25:18.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout_objects/test_prepended_appended_text.html
 2024-02-27 07:36:14.000000000 +0100
@@ -4,7 +4,8 @@
         <div class="">
             <div class="input-group">
                 <div class="input-group-prepend active"><span 
class="input-group-text">@</span></div>
-                <input type="text" name="email" maxlength="30" 
class="textinput textInput form-control custom-size-class" required 
id="id_email">
+                <input type="text" name="email" maxlength="30" 
aria-describedby="id_email_helptext"
+                       class="textinput textInput form-control 
custom-size-class" required id="id_email">
                 <div class="input-group-append active">
                     <span class="input-group-text">gmail.com</span>
                 </div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout_objects/test_prepended_appended_text_lt50.html
 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout_objects/test_prepended_appended_text_lt50.html
--- 
old/crispy-bootstrap4-2022.1/tests/results/bootstrap4/test_layout_objects/test_prepended_appended_text_lt50.html
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/crispy-bootstrap4-2024.1/tests/results/bootstrap4/test_layout_objects/test_prepended_appended_text_lt50.html
    2024-02-27 07:36:14.000000000 +0100
@@ -0,0 +1,32 @@
+<form method="post">
+    <div id="div_id_email" class="form-group">
+        <label for="id_email" class=" requiredField"> email<span 
class="asteriskField">*</span> </label>
+        <div class="">
+            <div class="input-group">
+                <div class="input-group-prepend active"><span 
class="input-group-text">@</span></div>
+                <input type="text" name="email" maxlength="30" 
class="textinput textInput form-control custom-size-class" required 
id="id_email">
+                <div class="input-group-append active">
+                    <span class="input-group-text">gmail.com</span>
+                </div>
+            </div> <small id="hint_id_email" class="form-text 
text-muted">Insert your email</small>
+        </div>
+    </div>
+    <div id="div_id_password1" class="form-group">
+        <label for="id_password1" class=" requiredField"> password<span 
class="asteriskField">*</span> </label>
+        <div class="">
+            <div class="input-group input-lg">
+                <input type="password" name="password1" maxlength="30" 
class="textinput textInput form-control input-lg" required id="id_password1">
+                <div class="input-group-append"> <span 
class="input-group-text">#</span> </div>
+            </div>
+        </div>
+    </div>
+    <div id="div_id_password2" class="form-group">
+        <label for="id_password2" class=" requiredField">re-enter 
password<span class="asteriskField">*</span></label>
+        <div class="">
+            <div class="input-group input-sm">
+                <div class="input-group-prepend"><span 
class="input-group-text">$</span></div> 
+                <input type="password" name="password2" maxlength="30" 
class="textinput textInput form-control input-sm" required id="id_password2">
+            </div>
+        </div>
+    </div>
+</form>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crispy-bootstrap4-2022.1/tests/test_form_helper.py 
new/crispy-bootstrap4-2024.1/tests/test_form_helper.py
--- old/crispy-bootstrap4-2022.1/tests/test_form_helper.py      2022-12-17 
08:25:18.000000000 +0100
+++ new/crispy-bootstrap4-2024.1/tests/test_form_helper.py      2024-02-27 
07:36:14.000000000 +0100
@@ -122,12 +122,10 @@
     # First we render with errors
     c = Context({"testForm": form})
     # Ensure those errors were rendered
-    if django.VERSION < (4, 1):
-        # Removed "for = ..." from MultiWidget's <label>.
-        # 
https://github.com/django/django/commit/c6c6cd3c5ad9c36795bb120e521590424f034ae4
+    if django.VERSION < (5, 0):
         expected = parse_expected(
             "bootstrap4/test_form_helper/"
-            "test_form_show_errors_non_field_errors_true_lte40.html"
+            "test_form_show_errors_non_field_errors_true_lt50.html"
         )
     else:
         expected = parse_expected(
@@ -140,10 +138,10 @@
     form.helper.form_show_errors = False
     c = Context({"testForm": form})
     # Ensure errors were not rendered
-    if django.VERSION < (4, 1):
+    if django.VERSION < (5, 0):
         expected = parse_expected(
             "bootstrap4/test_form_helper/"
-            "test_form_show_errors_non_field_errors_false_lte40.html"
+            "test_form_show_errors_non_field_errors_false_lt50.html"
         )
     else:
         expected = parse_expected(
@@ -475,13 +473,25 @@
     )
     form.is_valid()
     form.helper.form_show_errors = True
-    assert parse_form(form) == parse_expected(
-        "bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_true.html"
-    )
+    if django.VERSION < (5, 0):
+        expected = (
+            
"bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_true_lt50.html"
+        )
+    else:
+        expected = (
+            
"bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_true.html"
+        )
+    assert parse_form(form) == parse_expected(expected)
     form.helper.form_show_errors = False
-    assert parse_form(form) == parse_expected(
-        "bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_false.html"
-    )
+    if django.VERSION < (5, 0):
+        expected = (
+            
"bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_false_lt50.html"
+        )
+    else:
+        expected = (
+            
"bootstrap4/test_form_helper/bootstrap_form_show_errors_bs4_false.html"
+        )
+    assert parse_form(form) == parse_expected(expected)
 
 
 def test_error_text_inline(settings):
@@ -633,14 +643,6 @@
     assert '<div class="form-group row">' not in html
 
 
-def test_template_pack_bs4():
-    form = SampleForm()
-    form.helper = FormHelper()
-    form.helper.template_pack = "bootstrap3"
-    html = render_crispy_form(form)
-    assert "controls" in html  # controls is bootstrap3 only
-
-
 def test_passthrough_context():
     """
     Test to ensure that context is passed through implicitly from outside of
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crispy-bootstrap4-2022.1/tests/test_layout.py 
new/crispy-bootstrap4-2024.1/tests/test_layout.py
--- old/crispy-bootstrap4-2022.1/tests/test_layout.py   2022-12-17 
08:25:18.000000000 +0100
+++ new/crispy-bootstrap4-2024.1/tests/test_layout.py   2024-02-27 
07:36:14.000000000 +0100
@@ -1,3 +1,4 @@
+import django
 import pytest
 from crispy_forms import __version__
 from crispy_forms.bootstrap import Field, InlineCheckboxes, UneditableField
@@ -535,10 +536,17 @@
         InlineCheckboxes("alphacheckboxes"),
         "numeric_multiple_checkboxes",
     )
-    assert parse_form(form) == parse_expected(
-        "bootstrap4/test_layout/"
-        "test_use_custom_control_is_used_in_checkboxes_true_failing.html"
-    )
+    if django.VERSION < (5, 0):
+        expected = (
+            "bootstrap4/test_layout/"
+            
"test_use_custom_control_is_used_in_checkboxes_true_failing_lt50.html"
+        )
+    else:
+        expected = (
+            "bootstrap4/test_layout/"
+            "test_use_custom_control_is_used_in_checkboxes_true_failing.html"
+        )
+    assert parse_form(form) == parse_expected(expected)
 
 
 def test_use_custom_control_is_used_in_radio():
@@ -567,10 +575,17 @@
     form.helper.layout = Layout(
         "radio_select",
     )
-    assert parse_form(form) == parse_expected(
-        "bootstrap4/test_layout/"
-        "test_use_custom_control_is_used_in_radio_true_failing.html"
-    )
+    if django.VERSION < (5, 0):
+        expected = (
+            "bootstrap4/test_layout/"
+            "test_use_custom_control_is_used_in_radio_true_failing_lt50.html"
+        )
+    else:
+        expected = (
+            "bootstrap4/test_layout/"
+            "test_use_custom_control_is_used_in_radio_true_failing.html"
+        )
+    assert parse_form(form) == parse_expected(expected)
 
 
 @pytest.mark.parametrize(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/crispy-bootstrap4-2022.1/tests/test_layout_objects.py 
new/crispy-bootstrap4-2024.1/tests/test_layout_objects.py
--- old/crispy-bootstrap4-2022.1/tests/test_layout_objects.py   2022-12-17 
08:25:18.000000000 +0100
+++ new/crispy-bootstrap4-2024.1/tests/test_layout_objects.py   2024-02-27 
07:36:14.000000000 +0100
@@ -1,5 +1,6 @@
 import re
 
+import django
 import pytest
 from crispy_forms import __version__
 from crispy_forms.bootstrap import (
@@ -123,7 +124,6 @@
 
 class TestBootstrapLayoutObjects:
     def test_custom_django_widget(self, settings):
-
         # Make sure an inherited RadioSelect gets rendered as it
         form = SampleFormCustomWidgets()
         assert isinstance(form.fields["inline_radios"].widget, 
CustomRadioSelect)
@@ -158,10 +158,15 @@
             AppendedText("password1", "#", css_class="input-lg"),
             PrependedText("password2", "$", css_class="input-sm"),
         )
-        pack = settings.CRISPY_TEMPLATE_PACK
-        assert parse_form(test_form) == parse_expected(
-            f"{pack}/test_layout_objects/test_prepended_appended_text.html"
-        )
+        if django.VERSION < (5, 0):
+            expected = (
+                
"bootstrap4/test_layout_objects/test_prepended_appended_text_lt50.html"
+            )
+        else:
+            expected = (
+                
"bootstrap4/test_layout_objects/test_prepended_appended_text.html"
+            )
+        assert parse_form(test_form) == parse_expected(expected)
 
     def test_prepended_wrapper_class(self):
         test_form = SampleForm()
@@ -418,7 +423,7 @@
         test_form.helper[1].wrap(InlineCheckboxes, inline=True)
         html = render_crispy_form(test_form)
 
-        assert html.count('inline="True"') == 4
+        assert html.count('inline="True"') == 3
         assert html.count('custom-control-inline"') == 3
 
     def test_multiple_checkboxes_unique_ids(self):
@@ -455,13 +460,24 @@
         form = GroupedChoiceForm({})
         form.helper = FormHelper()
         form.helper.layout = Layout("checkbox_select_multiple")
-        assert parse_form(form) == parse_expected(
-            
"bootstrap4/test_layout_objects/test_grouped_checkboxes_failing.html"
-        )
+        if django.VERSION < (5, 0):
+            expected = (
+                "bootstrap4/test_layout_objects/"
+                "test_grouped_checkboxes_failing_lt50.html"
+            )
+        else:
+            expected = (
+                
"bootstrap4/test_layout_objects/test_grouped_checkboxes_failing.html"
+            )
+        assert parse_form(form) == parse_expected(expected)
         form.helper.layout = Layout("radio")
-        assert parse_form(form) == parse_expected(
-            "bootstrap4/test_layout_objects/test_grouped_radios_failing.html"
-        )
+        if django.VERSION < (5, 0):
+            expected = (
+                
"bootstrap4/test_layout_objects/test_grouped_radios_failing_lt50.html"
+            )
+        else:
+            expected = 
"bootstrap4/test_layout_objects/test_grouped_radios_failing.html"
+        assert parse_form(form) == parse_expected(expected)
 
     def test_non_ascii_chars_in_container_name(self):
         """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/crispy-bootstrap4-2022.1/tox.ini 
new/crispy-bootstrap4-2024.1/tox.ini
--- old/crispy-bootstrap4-2022.1/tox.ini        2022-12-17 08:25:18.000000000 
+0100
+++ new/crispy-bootstrap4-2024.1/tox.ini        2024-02-27 07:36:14.000000000 
+0100
@@ -3,17 +3,17 @@
 
 [tox]
 envlist =
-    {py37,py38,py39,py310}-django{32}-crispy{1,-latest},
-    {py38,py39,py310}-django{40,41,-latest}-crispy{1,-latest},
-    {py311}-django{41,-latest}-crispy{1,-latest},
+    {py38,py39,py310,py311}-django{42}-crispy{2,-latest},
+    {py310,py311,py312}-django{50,-latest}-crispy{2,-latest},
     lint
 
 [testenv]
+package = wheel
+wheel_build_env = .pkg
 deps =
-    django32: django>=3.2,<3.3
-    django40: django>=4.0a,<4.1
-    django41: django>=4.1a,<4.2
-    crispy1: django-crispy-forms<=2.0
+    django42: django>=4.2,<5.0
+    django50: django>=5.0a1,<5.1
+    crispy2: django-crispy-forms>=2.0
     crispy-latest: 
https://github.com/django-crispy-forms/django-crispy-forms/archive/main.tar.gz
     -rrequirements/testing.txt
 commands = python -W error::DeprecationWarning -W 
error::PendingDeprecationWarning -m pytest {posargs}

Reply via email to