Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-django-crispy-forms for 
openSUSE:Factory checked in at 2026-03-13 21:18:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-django-crispy-forms (Old)
 and      /work/SRC/openSUSE:Factory/.python-django-crispy-forms.new.8177 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-django-crispy-forms"

Fri Mar 13 21:18:29 2026 rev:19 rq:1338736 version:2.6

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-django-crispy-forms/python-django-crispy-forms.changes
    2026-01-22 15:19:44.056119033 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-django-crispy-forms.new.8177/python-django-crispy-forms.changes
  2026-03-13 21:22:28.487380882 +0100
@@ -1,0 +2,6 @@
+Fri Mar  6 12:19:03 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 2.6:
+  * Dropped support for Django 4.2, 5.0 and 5.1.
+
+-------------------------------------------------------------------

Old:
----
  django_crispy_forms-2.5.tar.gz

New:
----
  django_crispy_forms-2.6.tar.gz

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

Other differences:
------------------
++++++ python-django-crispy-forms.spec ++++++
--- /var/tmp/diff_new_pack.DaNmFN/_old  2026-03-13 21:22:29.071405083 +0100
+++ /var/tmp/diff_new_pack.DaNmFN/_new  2026-03-13 21:22:29.079405415 +0100
@@ -28,7 +28,7 @@
 %define mod_name django_crispy_forms
 %{?sle15_python_module_pythons}
 Name:           python-django-crispy-forms%{psuffix}
-Version:        2.5
+Version:        2.6
 Release:        0
 Summary:        Django DRY Forms
 License:        MIT

++++++ django_crispy_forms-2.5.tar.gz -> django_crispy_forms-2.6.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/.pre-commit-config.yaml 
new/django_crispy_forms-2.6/.pre-commit-config.yaml
--- old/django_crispy_forms-2.5/.pre-commit-config.yaml 2025-11-06 
21:43:49.000000000 +0100
+++ new/django_crispy_forms-2.6/.pre-commit-config.yaml 2026-03-01 
10:03:26.000000000 +0100
@@ -1,10 +1,10 @@
 repos:
   - repo: https://github.com/psf/black
-    rev: 25.9.0
+    rev: 26.1.0
     hooks:
       - id: black
   -   repo: https://github.com/pycqa/isort
-      rev: 7.0.0
+      rev: 8.0.1
       hooks:
       - id: isort
   -   repo: https://github.com/pycqa/flake8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/CHANGELOG.md 
new/django_crispy_forms-2.6/CHANGELOG.md
--- old/django_crispy_forms-2.5/CHANGELOG.md    2025-11-06 21:43:49.000000000 
+0100
+++ new/django_crispy_forms-2.6/CHANGELOG.md    2026-03-01 10:03:26.000000000 
+0100
@@ -1,5 +1,8 @@
 # CHANGELOG for django-crispy-forms
 
+## 2.6 (2026-03-01)
+* Dropped support for Django 4.2, 5.0 and 5.1.
+
 ## 2.5 (2025-11-06)
 * Confirmed support for Python 3.14.
 * Confirmed support for Django 6.0.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/PKG-INFO 
new/django_crispy_forms-2.6/PKG-INFO
--- old/django_crispy_forms-2.5/PKG-INFO        2025-11-06 21:43:58.532834500 
+0100
+++ new/django_crispy_forms-2.6/PKG-INFO        2026-03-01 10:03:33.870061400 
+0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: django-crispy-forms
-Version: 2.5
+Version: 2.6
 Summary: Best way to have Django DRY forms
 Author-email: Miguel Araujo <[email protected]>
 License-Expression: MIT
@@ -11,26 +11,23 @@
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Web Environment
 Classifier: Framework :: Django
-Classifier: Framework :: Django :: 4.2
-Classifier: Framework :: Django :: 5.0
-Classifier: Framework :: Django :: 5.1
 Classifier: Framework :: Django :: 5.2
 Classifier: Framework :: Django :: 6.0
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: JavaScript
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
 Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
 Classifier: Topic :: Internet :: WWW/HTTP
 Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Requires-Python: >=3.9
+Requires-Python: >=3.10
 Description-Content-Type: text/x-rst
 License-File: LICENSE.txt
-Requires-Dist: django>=4.2
+Requires-Dist: django>=5.2
 Dynamic: license-file
 
 ===================
@@ -47,7 +44,7 @@
 
 The best way to have Django_ DRY forms. Build programmatic reusable layouts 
out of components, having full control of the rendered HTML without writing 
HTML in templates. All this without breaking the standard way of doing things 
in Django, so it plays nice with any other form application.
 
-`django-crispy-forms` supports Django 4.2+ with Python 3.9+.
+`django-crispy-forms` supports Django 5.2+ with Python 3.10+.
 
 Looking for Bootstrap 5 support? See the `crispy-bootstrap5 package`_.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/README.rst 
new/django_crispy_forms-2.6/README.rst
--- old/django_crispy_forms-2.5/README.rst      2025-11-06 21:43:49.000000000 
+0100
+++ new/django_crispy_forms-2.6/README.rst      2026-03-01 10:03:26.000000000 
+0100
@@ -12,7 +12,7 @@
 
 The best way to have Django_ DRY forms. Build programmatic reusable layouts 
out of components, having full control of the rendered HTML without writing 
HTML in templates. All this without breaking the standard way of doing things 
in Django, so it plays nice with any other form application.
 
-`django-crispy-forms` supports Django 4.2+ with Python 3.9+.
+`django-crispy-forms` supports Django 5.2+ with Python 3.10+.
 
 Looking for Bootstrap 5 support? See the `crispy-bootstrap5 package`_.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/crispy_forms/__init__.py 
new/django_crispy_forms-2.6/crispy_forms/__init__.py
--- old/django_crispy_forms-2.5/crispy_forms/__init__.py        2025-11-06 
21:43:49.000000000 +0100
+++ new/django_crispy_forms-2.6/crispy_forms/__init__.py        2026-03-01 
10:03:26.000000000 +0100
@@ -1 +1 @@
-__version__ = "2.5"
+__version__ = "2.6"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/crispy_forms/bootstrap.py 
new/django_crispy_forms-2.6/crispy_forms/bootstrap.py
--- old/django_crispy_forms-2.5/crispy_forms/bootstrap.py       2025-11-06 
21:43:49.000000000 +0100
+++ new/django_crispy_forms-2.6/crispy_forms/bootstrap.py       2026-03-01 
10:03:26.000000000 +0100
@@ -505,7 +505,7 @@
         The default template which this Layout Object will be rendered
         with.
     field_classes : str
-        The CSS classes to be applied to the button. By defult "btn".
+        The CSS classes to be applied to the button. By default "btn".
 
     Parameters
     ----------
@@ -911,7 +911,7 @@
         The default template which this Layout Object will be rendered
         with.
     css_class : str
-        The CSS classes to be applied to the alert. By defult "alert".
+        The CSS classes to be applied to the alert. By default "alert".
 
     Parameters
     ----------
@@ -1054,7 +1054,7 @@
 
 class Modal(LayoutObject):
     """
-    Boostrap layout object for rendering crispy forms objects inside a
+    Bootstrap layout object for rendering crispy forms objects inside a
     bootstrap modal.
 
     Attributes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/crispy_forms/helper.py 
new/django_crispy_forms-2.6/crispy_forms/helper.py
--- old/django_crispy_forms-2.5/crispy_forms/helper.py  2025-11-06 
21:43:49.000000000 +0100
+++ new/django_crispy_forms-2.6/crispy_forms/helper.py  2026-03-01 
10:03:26.000000000 +0100
@@ -223,10 +223,8 @@
     @form_method.setter
     def form_method(self, method):
         if method.lower() not in ("get", "post"):
-            raise FormHelpersException(
-                "Only GET and POST are valid in the \
-                    form_method helper attribute"
-            )
+            raise FormHelpersException("Only GET and POST are valid in the \
+                    form_method helper attribute")
 
         self._form_method = method.lower()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/crispy_forms/layout.py 
new/django_crispy_forms-2.6/crispy_forms/layout.py
--- old/django_crispy_forms-2.5/crispy_forms/layout.py  2025-11-06 
21:43:49.000000000 +0100
+++ new/django_crispy_forms-2.6/crispy_forms/layout.py  2026-03-01 
10:03:26.000000000 +0100
@@ -827,7 +827,7 @@
     css_class : str, optional
         Additional CSS classes to be applied in addition to those declared by
         the class itself. If using the Bootstrap4 template pack the default
-        ``col-md`` is removed if this string contins another ``col-`` class.
+        ``col-md`` is removed if this string contains another ``col-`` class.
         By default None.
     template : str, optional
         Overrides the default template, if provided. By default None.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/crispy_forms/layout_slice.py 
new/django_crispy_forms-2.6/crispy_forms/layout_slice.py
--- old/django_crispy_forms-2.5/crispy_forms/layout_slice.py    2025-11-06 
21:43:49.000000000 +0100
+++ new/django_crispy_forms-2.6/crispy_forms/layout_slice.py    2026-03-01 
10:03:26.000000000 +0100
@@ -64,10 +64,8 @@
                     except IndexError:
                         # We could avoid this exception, recalculating 
pointers.
                         # However this case is most of the time an undesired 
behavior
-                        raise DynamicError(
-                            "Trying to wrap a field within an already wrapped 
field, \
-                            recheck your filter or layout"
-                        )
+                        raise DynamicError("Trying to wrap a field within an 
already wrapped field, \
+                            recheck your filter or layout")
 
     def wrap(self, LayoutClass, *args, **kwargs):
         """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/django_crispy_forms-2.5/crispy_forms/templatetags/crispy_forms_filters.py 
new/django_crispy_forms-2.6/crispy_forms/templatetags/crispy_forms_filters.py
--- 
old/django_crispy_forms-2.5/crispy_forms/templatetags/crispy_forms_filters.py   
    2025-11-06 21:43:49.000000000 +0100
+++ 
new/django_crispy_forms-2.6/crispy_forms/templatetags/crispy_forms_filters.py   
    2026-03-01 10:03:26.000000000 +0100
@@ -96,7 +96,7 @@
         {{ form.field|as_crispy_field:"bootstrap4" }}
     """
     if not isinstance(field, boundfield.BoundField) and settings.DEBUG:
-        raise CrispyError("|as_crispy_field got passed an invalid or 
inexistent field")
+        raise CrispyError(f"|as_crispy_field received invalid field: 
'{field}'.")
 
     attributes = {
         "field": field,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/django_crispy_forms-2.5/crispy_forms/templatetags/crispy_forms_tags.py 
new/django_crispy_forms-2.6/crispy_forms/templatetags/crispy_forms_tags.py
--- old/django_crispy_forms-2.5/crispy_forms/templatetags/crispy_forms_tags.py  
2025-11-06 21:43:49.000000000 +0100
+++ new/django_crispy_forms-2.6/crispy_forms/templatetags/crispy_forms_tags.py  
2026-03-01 10:03:26.000000000 +0100
@@ -3,6 +3,7 @@
 from django import template
 from django.conf import settings
 from django.forms.formsets import BaseFormSet
+from django.template import VariableDoesNotExist
 from django.template.loader import get_template
 
 from crispy_forms.helper import FormHelper
@@ -196,7 +197,10 @@
 
 class CrispyFormNode(BasicNode):
     def render(self, context):
-        c = self.get_render(context).flatten()
+        try:
+            c = self.get_render(context).flatten()
+        except VariableDoesNotExist:
+            return context.template.engine.string_if_invalid
 
         if self.actual_helper is not None and getattr(self.actual_helper, 
"template", False):
             template = get_template(self.actual_helper.template)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/django_crispy_forms-2.5/django_crispy_forms.egg-info/PKG-INFO 
new/django_crispy_forms-2.6/django_crispy_forms.egg-info/PKG-INFO
--- old/django_crispy_forms-2.5/django_crispy_forms.egg-info/PKG-INFO   
2025-11-06 21:43:58.000000000 +0100
+++ new/django_crispy_forms-2.6/django_crispy_forms.egg-info/PKG-INFO   
2026-03-01 10:03:33.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: django-crispy-forms
-Version: 2.5
+Version: 2.6
 Summary: Best way to have Django DRY forms
 Author-email: Miguel Araujo <[email protected]>
 License-Expression: MIT
@@ -11,26 +11,23 @@
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Web Environment
 Classifier: Framework :: Django
-Classifier: Framework :: Django :: 4.2
-Classifier: Framework :: Django :: 5.0
-Classifier: Framework :: Django :: 5.1
 Classifier: Framework :: Django :: 5.2
 Classifier: Framework :: Django :: 6.0
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: JavaScript
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
 Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
 Classifier: Topic :: Internet :: WWW/HTTP
 Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Requires-Python: >=3.9
+Requires-Python: >=3.10
 Description-Content-Type: text/x-rst
 License-File: LICENSE.txt
-Requires-Dist: django>=4.2
+Requires-Dist: django>=5.2
 Dynamic: license-file
 
 ===================
@@ -47,7 +44,7 @@
 
 The best way to have Django_ DRY forms. Build programmatic reusable layouts 
out of components, having full control of the rendered HTML without writing 
HTML in templates. All this without breaking the standard way of doing things 
in Django, so it plays nice with any other form application.
 
-`django-crispy-forms` supports Django 4.2+ with Python 3.9+.
+`django-crispy-forms` supports Django 5.2+ with Python 3.10+.
 
 Looking for Bootstrap 5 support? See the `crispy-bootstrap5 package`_.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/django_crispy_forms-2.5/django_crispy_forms.egg-info/SOURCES.txt 
new/django_crispy_forms-2.6/django_crispy_forms.egg-info/SOURCES.txt
--- old/django_crispy_forms-2.5/django_crispy_forms.egg-info/SOURCES.txt        
2025-11-06 21:43:58.000000000 +0100
+++ new/django_crispy_forms-2.6/django_crispy_forms.egg-info/SOURCES.txt        
2026-03-01 10:03:33.000000000 +0100
@@ -92,10 +92,8 @@
 tests/test_utils.py
 tests/urls.py
 tests/utils.py
-tests/results/test_formset_layout lt50.html
 tests/results/test_formset_layout.html
 tests/results/test_modelformset_layout.html
-tests/results/test_render_hidden_fields lt50.html
 tests/results/test_render_hidden_fields.html
 tests/results/utils_test.html
 tests/results/bootstrap/test_layout_objects/test_field_with_buttons.html
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/django_crispy_forms-2.5/django_crispy_forms.egg-info/requires.txt 
new/django_crispy_forms-2.6/django_crispy_forms.egg-info/requires.txt
--- old/django_crispy_forms-2.5/django_crispy_forms.egg-info/requires.txt       
2025-11-06 21:43:58.000000000 +0100
+++ new/django_crispy_forms-2.6/django_crispy_forms.egg-info/requires.txt       
2026-03-01 10:03:33.000000000 +0100
@@ -1 +1 @@
-django>=4.2
+django>=5.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/docs/conf.py 
new/django_crispy_forms-2.6/docs/conf.py
--- old/django_crispy_forms-2.5/docs/conf.py    2025-11-06 21:43:49.000000000 
+0100
+++ new/django_crispy_forms-2.6/docs/conf.py    2026-03-01 10:03:26.000000000 
+0100
@@ -55,9 +55,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = "2.5"
+version = "2.6"
 # The full version, including alpha/beta/rc tags.
-release = "2.5"
+release = "2.6"
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/docs/crispy_tag_forms.rst 
new/django_crispy_forms-2.6/docs/crispy_tag_forms.rst
--- old/django_crispy_forms-2.5/docs/crispy_tag_forms.rst       2025-11-06 
21:43:49.000000000 +0100
+++ new/django_crispy_forms-2.6/docs/crispy_tag_forms.rst       2026-03-01 
10:03:26.000000000 +0100
@@ -76,7 +76,7 @@
 
 Note that we are importing a class called ``Submit`` that is a layout object. 
We will see what layout objects are in detail later on, for now on let's just 
say that this adds a submit button to our form, so people can send their survey.
 
-We've also done some helper magic. ``FormHelper`` has a list of attributes 
that can be set, that affect mainly form attributes. Our form will have as DOM 
id ``id-exampleForm``, it will have as DOM CSS class ``blueForms``, it will use 
http ``POST`` to send information and its action will be set to 
``reverse(submit_survey)``.
+We've also done some helper magic. ``FormHelper`` has a list of attributes 
that can be set, that affect mainly form attributes. Our form will have as DOM 
id ``id-exampleForm``, it will have as DOM CSS class ``blueForms``, it will use 
http ``POST`` to send information and its action will be set to 
``submit_survey``.
 
 Let's see how to render the form in a template. Supposing we have the form in 
the template context as ``example_form``, we would render it doing::
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/docs/layouts.rst 
new/django_crispy_forms-2.6/docs/layouts.rst
--- old/django_crispy_forms-2.5/docs/layouts.rst        2025-11-06 
21:43:49.000000000 +0100
+++ new/django_crispy_forms-2.6/docs/layouts.rst        2026-03-01 
10:03:26.000000000 +0100
@@ -301,7 +301,7 @@
 
     Layout(
         Modal(
-            # email.help_text was set during the initalization of the django 
form field
+            # email.help_text was set during the initialization of the django 
form field
             Field('email', placeholder="Email", wrapper_class="mb-0"),
             Button(
                 "submit",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/pyproject.toml 
new/django_crispy_forms-2.6/pyproject.toml
--- old/django_crispy_forms-2.5/pyproject.toml  2025-11-06 21:43:49.000000000 
+0100
+++ new/django_crispy_forms-2.6/pyproject.toml  2026-03-01 10:03:26.000000000 
+0100
@@ -4,32 +4,29 @@
 
 [project]
 name = "django-crispy-forms"
-requires-python = ">=3.9"
+requires-python = ">=3.10"
 description = "Best way to have Django DRY forms"
 classifiers=[
     "Development Status :: 5 - Production/Stable",
     "Environment :: Web Environment",
     "Framework :: Django",
-    "Framework :: Django :: 4.2",
-    "Framework :: Django :: 5.0",
-    "Framework :: Django :: 5.1",
     "Framework :: Django :: 5.2",
     "Framework :: Django :: 6.0",
     "Operating System :: OS Independent",
     "Programming Language :: JavaScript",
     "Programming Language :: Python :: 3",
-    "Programming Language :: Python :: 3.9",
     "Programming Language :: Python :: 3.10",
     "Programming Language :: Python :: 3.11",
     "Programming Language :: Python :: 3.12",
     "Programming Language :: Python :: 3.13",
+    "Programming Language :: Python :: 3.14",
     "Topic :: Internet :: WWW/HTTP",
     "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
     "Topic :: Software Development :: Libraries :: Python Modules",
 ]
 license = "MIT"
 license-files = ["LICENSE.txt"]
-dependencies = ["django>=4.2"]
+dependencies = ["django>=5.2"]
 authors = [{name = "Miguel Araujo", email = "[email protected]"}]
 dynamic = ['version']
 readme = "README.rst"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
"old/django_crispy_forms-2.5/tests/results/test_formset_layout lt50.html" 
"new/django_crispy_forms-2.6/tests/results/test_formset_layout lt50.html"
--- "old/django_crispy_forms-2.5/tests/results/test_formset_layout lt50.html"   
2025-11-06 21:43:49.000000000 +0100
+++ "new/django_crispy_forms-2.6/tests/results/test_formset_layout lt50.html"   
1970-01-01 01:00:00.000000000 +0100
@@ -1,144 +0,0 @@
-<form action="/simple/action/" class="formsets-that-rock" 
id="thisFormsetRocks" method="post"> 
-    <input type="hidden" name="csrfmiddlewaretoken" value="aTestToken">
-    <div>
-        <input type="hidden" name="form-TOTAL_FORMS" value="3" 
id="id_form-TOTAL_FORMS"> 
-        <input type="hidden" name="form-INITIAL_FORMS" value="0" 
id="id_form-INITIAL_FORMS">
-        <input type="hidden" name="form-MIN_NUM_FORMS" value="0" 
id="id_form-MIN_NUM_FORMS">
-        <input type="hidden" name="form-MAX_NUM_FORMS" value="1000" 
id="id_form-MAX_NUM_FORMS">
-    </div>
-    <fieldset>
-        <legend>Item 1</legend>
-        <div class="form-group">
-            <div id="div_id_form-0-is_company" class="checkbox"> 
-                <label for="id_form-0-is_company" class="">
-                    <input type="checkbox" name="form-0-is_company" 
class="checkboxinput" id="id_form-0-is_company">
-                    company
-                </label>
-            </div>
-        </div>
-        <div id="div_id_form-0-email" class="form-group">
-            <label for="id_form-0-email" class="control-label  requiredField"> 
email<span class="asteriskField">*</span></label>
-            <div class="controls ">
-                <input type="text" name="form-0-email" maxlength="30" 
class="textinput textInput inputtext form-control" id="id_form-0-email">
-                <div id="hint_id_form-0-email" class="help-block">Insert your 
email</div>
-            </div>
-        </div>
-    </fieldset>
-    Note for first form only
-    <div class="row ">
-        <div id="div_id_form-0-password1" class="form-group">
-            <label for="id_form-0-password1" class="control-label  
requiredField"> password<span class="asteriskField">*</span></label>
-            <div class="controls ">
-                <input type="password" name="form-0-password1" maxlength="30" 
class="passwordinput form-control" id="id_form-0-password1">
-            </div>
-        </div>
-        <div id="div_id_form-0-password2" class="form-group">
-            <label for="id_form-0-password2" class="control-label  
requiredField"> re-enter password<span class="asteriskField">*</span></label>
-            <div class="controls ">
-                <input type="password" name="form-0-password2" maxlength="30" 
class="passwordinput form-control" id="id_form-0-password2">
-            </div>
-        </div>
-    </div>
-    <fieldset>
-        <div id="div_id_form-0-first_name" class="form-group">
-            <label for="id_form-0-first_name" class="control-label  
requiredField"> first name<span class="asteriskField">*</span></label>
-            <div class="controls ">
-                <input type="text" name="form-0-first_name" maxlength="5" 
class="textinput textInput inputtext form-control" id="id_form-0-first_name">
-            </div>
-        </div>
-        <div id="div_id_form-0-last_name" class="form-group">
-            <label for="id_form-0-last_name" class="control-label  
requiredField"> last name<span class="asteriskField">*</span></label>
-            <div class="controls ">
-                <input type="text" name="form-0-last_name" maxlength="5" 
class="textinput textInput inputtext form-control" id="id_form-0-last_name"> 
-            </div>
-        </div>
-    </fieldset>
-    <fieldset>
-        <legend>Item 2</legend>
-        <div class="form-group">
-            <div id="div_id_form-1-is_company" class="checkbox"> 
-                <label for="id_form-1-is_company" class=""> 
-                    <input type="checkbox" name="form-1-is_company" 
class="checkboxinput" id="id_form-1-is_company">
-                    company
-                </label> 
-            </div>
-        </div>
-        <div id="div_id_form-1-email" class="form-group">
-            <label for="id_form-1-email" class="control-label  requiredField"> 
email<span class="asteriskField">*</span></label>
-            <div class="controls "> 
-                <input type="text" name="form-1-email" maxlength="30" 
class="textinput textInput inputtext form-control" id="id_form-1-email">
-                <div id="hint_id_form-1-email" class="help-block">Insert your 
email</div>
-            </div>
-        </div>
-    </fieldset>
-    <div class="row ">
-        <div id="div_id_form-1-password1" class="form-group"> 
-            <label for="id_form-1-password1" class="control-label  
requiredField"> password<span class="asteriskField">*</span></label>
-            <div class="controls ">
-                <input type="password" name="form-1-password1" maxlength="30" 
class="passwordinput form-control" id="id_form-1-password1">
-            </div>
-        </div>
-        <div id="div_id_form-1-password2" class="form-group"> 
-            <label for="id_form-1-password2" class="control-label  
requiredField"> re-enter password<span class="asteriskField">*</span></label>
-            <div class="controls ">
-                <input type="password" name="form-1-password2" maxlength="30" 
class="passwordinput form-control" id="id_form-1-password2"> 
-            </div>
-        </div>
-    </div>
-    <fieldset>
-        <div id="div_id_form-1-first_name" class="form-group"> 
-            <label for="id_form-1-first_name" class="control-label  
requiredField"> first name<span class="asteriskField">*</span></label>
-            <div class="controls ">
-                <input type="text" name="form-1-first_name" maxlength="5" 
class="textinput textInput inputtext form-control" id="id_form-1-first_name">
-            </div>
-        </div>
-        <div id="div_id_form-1-last_name" class="form-group"> 
-            <label for="id_form-1-last_name" class="control-label  
requiredField"> last name<span class="asteriskField">*</span> </label>
-            <div class="controls "> 
-                <input type="text" name="form-1-last_name" maxlength="5" 
class="textinput textInput inputtext form-control" id="id_form-1-last_name"> 
-            </div>
-        </div>
-    </fieldset>
-    <fieldset>
-        <legend>Item 3</legend>
-        <div class="form-group">
-            <div id="div_id_form-2-is_company" class="checkbox"> 
-                <label for="id_form-2-is_company" class=""> 
-                    <input type="checkbox" name="form-2-is_company" 
class="checkboxinput" id="id_form-2-is_company">
-                    company
-                </label> 
-            </div>
-        </div>
-        <div id="div_id_form-2-email" class="form-group"> 
-            <label for="id_form-2-email" class="control-label  requiredField"> 
email<span class="asteriskField">*</span> </label>
-            <div class="controls "> 
-                <input type="text" name="form-2-email" maxlength="30" 
class="textinput textInput inputtext form-control" id="id_form-2-email">
-                <div id="hint_id_form-2-email" class="help-block">Insert your 
email</div>
-            </div>
-        </div>
-    </fieldset>
-    <div class="row ">
-        <div id="div_id_form-2-password1" class="form-group"> 
-            <label for="id_form-2-password1" class="control-label  
requiredField"> password<span class="asteriskField">*</span> </label>
-            <div class="controls "> 
-                <input type="password" name="form-2-password1" maxlength="30" 
class="passwordinput form-control" id="id_form-2-password1"> </div>
-        </div>
-        <div id="div_id_form-2-password2" class="form-group"> 
-            <label for="id_form-2-password2" class="control-label  
requiredField"> re-enter password<span class="asteriskField">*</span> </label>
-            <div class="controls "> 
-                <input type="password" name="form-2-password2" maxlength="30" 
class="passwordinput form-control" id="id_form-2-password2"> </div>
-        </div>
-    </div>
-    <fieldset>
-        <div id="div_id_form-2-first_name" class="form-group"> 
-            <label for="id_form-2-first_name" class="control-label  
requiredField"> first name<span class="asteriskField">*</span> </label>
-            <div class="controls "> 
-                <input type="text" name="form-2-first_name" maxlength="5" 
class="textinput textInput inputtext form-control" id="id_form-2-first_name"> 
</div>
-        </div>
-        <div id="div_id_form-2-last_name" class="form-group"> 
-            <label for="id_form-2-last_name" class="control-label  
requiredField"> last name<span class="asteriskField">*</span> </label>
-            <div class="controls "> 
-                <input type="text" name="form-2-last_name" maxlength="5" 
class="textinput textInput inputtext form-control" id="id_form-2-last_name"> 
</div>
-        </div>
-    </fieldset>
-</form>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
"old/django_crispy_forms-2.5/tests/results/test_render_hidden_fields lt50.html" 
"new/django_crispy_forms-2.6/tests/results/test_render_hidden_fields lt50.html"
--- "old/django_crispy_forms-2.5/tests/results/test_render_hidden_fields 
lt50.html"     2025-11-06 21:43:49.000000000 +0100
+++ "new/django_crispy_forms-2.6/tests/results/test_render_hidden_fields 
lt50.html"     1970-01-01 01:00:00.000000000 +0100
@@ -1,11 +0,0 @@
-<form method="post">
-    <div id="div_id_email" class="form-group">
-        <label for="id_email" class="control-label  requiredField">email<span 
class="asteriskField">*</span></label>
-        <div class="controls ">
-            <input type="text" name="email" maxlength="30" class="textinput 
textInput inputtext form-control" required id="id_email">
-            <div id="hint_id_email" class="help-block">Insert your email</div>
-        </div>
-    </div>
-    <input type="hidden" name="password1" id="id_password1">
-    <input type="hidden" name="password2" id="id_password2">
-</form>
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/tests/test_form_helper.py 
new/django_crispy_forms-2.6/tests/test_form_helper.py
--- old/django_crispy_forms-2.5/tests/test_form_helper.py       2025-11-06 
21:43:49.000000000 +0100
+++ new/django_crispy_forms-2.6/tests/test_form_helper.py       2026-03-01 
10:03:26.000000000 +0100
@@ -25,12 +25,10 @@
     form_helper.add_input(Hidden("my-hidden", "Hidden"))
     form_helper.add_input(Button("my-button", "Button"))
 
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy form form_helper %}
-    """
-    )
+    """)
     c = Context({"form": SampleForm(), "form_helper": form_helper})
     html = template.render(c)
 
@@ -59,12 +57,10 @@
     form_helper.form_action = "simpleAction"
     form_helper.form_error_title = "ERRORS"
 
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy testForm form_helper %}
-    """
-    )
+    """)
 
     # now we render it, with errors
     form = SampleForm({"password1": "wargame", "password2": "god"})
@@ -177,12 +173,10 @@
 
 
 def test_without_helper():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy form %}
-    """
-    )
+    """)
     c = Context({"form": SampleForm()})
     html = template.render(c)
 
@@ -200,13 +194,10 @@
         override_pack = "bootstrap4"
 
     # {% crispy form 'template_pack_name' %}
-    template = Template(
-        """
+    template = Template("""
         {%% load crispy_forms_tags %%}
         {%% crispy form "%s" %%}
-    """
-        % override_pack
-    )
+    """ % override_pack)
     c = Context({"form": SampleForm()})
     html = template.render(c)
 
@@ -224,13 +215,10 @@
         override_pack = "bootstrap4"
 
     # {% crispy form helper 'template_pack_name' %}
-    template = Template(
-        """
+    template = Template("""
         {%% load crispy_forms_tags %%}
         {%% crispy form form_helper "%s" %%}
-    """
-        % override_pack
-    )
+    """ % override_pack)
     c = Context({"form": SampleForm(), "form_helper": FormHelper()})
     html = template.render(c)
     assert "controls" not in html
@@ -238,21 +226,17 @@
 
 def test_template_pack_override_wrong():
     with pytest.raises(TemplateSyntaxError):
-        Template(
-            """
+        Template("""
             {% load crispy_forms_tags %}
             {% crispy form 'foo' %}
-        """
-        )
+        """)
 
 
 def test_invalid_helper(settings):
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy form form_helper %}
-    """
-    )
+    """)
     c = Context({"form": SampleForm(), "form_helper": "invalid"})
 
     settings.CRISPY_FAIL_SILENTLY = settings.TEMPLATE_DEBUG = False
@@ -261,12 +245,10 @@
 
 
 def test_formset_with_helper_without_layout():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy testFormSet formset_helper %}
-    """
-    )
+    """)
 
     form_helper = FormHelper()
     form_helper.form_id = "thisFormsetRocks"
@@ -296,12 +278,10 @@
 
 def test_CSRF_token_POST_form():
     form_helper = FormHelper()
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy form form_helper %}
-    """
-    )
+    """)
 
     # The middleware only initializes the CSRF token when processing a real 
request
     # So using RequestContext or csrf(request) here does not work.
@@ -315,12 +295,10 @@
 def test_CSRF_token_GET_form():
     form_helper = FormHelper()
     form_helper.form_method = "GET"
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy form form_helper %}
-    """
-    )
+    """)
 
     c = Context({"form": SampleForm(), "form_helper": form_helper, 
"csrf_token": _get_new_csrf_string()})
     html = template.render(c)
@@ -389,10 +367,7 @@
     # Now hide a couple of fields
     for field in ("password1", "password2"):
         test_form.fields[field].widget = forms.HiddenInput()
-    if django.VERSION < (5, 0):
-        result = "test_render_hidden_fields lt50.html"
-    else:
-        result = "test_render_hidden_fields.html"
+    result = "test_render_hidden_fields.html"
     assert parse_expected(result) == parse_form(test_form)
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/tests/test_layout.py 
new/django_crispy_forms-2.6/tests/test_layout.py
--- old/django_crispy_forms-2.5/tests/test_layout.py    2025-11-06 
21:43:49.000000000 +0100
+++ new/django_crispy_forms-2.6/tests/test_layout.py    2026-03-01 
10:03:26.000000000 +0100
@@ -1,4 +1,3 @@
-import django
 import pytest
 from django import forms
 from django.forms.models import formset_factory, modelformset_factory
@@ -31,12 +30,10 @@
     form_helper = FormHelper()
     form_helper.add_layout(Layout("españa"))
 
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy form form_helper %}
-    """
-    )
+    """)
     c = Context({"form": SampleForm(), "form_helper": form_helper})
     settings.CRISPY_FAIL_SILENTLY = False
     with pytest.raises(Exception):
@@ -68,12 +65,10 @@
     form_helper = FormHelper()
     form_helper.layout = Layout("first_name")
 
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy form form_helper %}
-    """
-    )
+    """)
     c = Context({"form": form, "form_helper": form_helper})
     html = template.render(c)
     assert "email" not in html
@@ -83,12 +78,10 @@
     form_helper = FormHelper()
     form_helper.add_layout(Layout("typo"))
 
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy form form_helper %}
-    """
-    )
+    """)
     c = Context({"form": SampleForm(), "form_helper": form_helper})
     settings.CRISPY_FAIL_SILENTLY = False
     with pytest.raises(Exception):
@@ -99,12 +92,10 @@
     form_helper = FormHelper()
     form_helper.add_layout(Layout("is_company", "is_company"))
 
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy form form_helper %}
-    """
-    )
+    """)
     c = Context({"form": SampleForm(), "form_helper": form_helper})
     settings.CRISPY_FAIL_SILENTLY = False
     with pytest.raises(Exception):
@@ -118,14 +109,12 @@
     form = ExampleForm()
     form2 = SampleForm()
 
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {{ form.as_ul }}
         {% crispy form2 %}
         {{ form.as_ul }}
-    """
-    )
+    """)
     c = Context({"form": form, "form2": form2})
     html = template.render(c)
 
@@ -155,23 +144,19 @@
                     css_class="rows",
                 ),
                 HTML('<a href="#" id="testLink">test link</a>'),
-                HTML(
-                    """
+                HTML("""
                     {% if flag %}{{ message }}{% endif %}
-                """
-                ),
+                """),
                 "first_name",
                 "last_name",
             ),
         )
     )
 
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy form form_helper %}
-    """
-    )
+    """)
     c = Context({"form": SampleForm(), "form_helper": form_helper, "flag": 
True, "message": "Hello!"})
     html = template.render(c)
 
@@ -187,12 +172,10 @@
 
 
 def test_change_layout_dynamically_delete_field():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy form form_helper %}
-    """
-    )
+    """)
 
     form = SampleForm()
     form.helper.add_layout(
@@ -243,10 +226,7 @@
     )
 
     html = render_crispy_form(form=formset, helper=helper, 
context={"csrf_token": "aTestToken"})
-    if django.VERSION < (5, 0):
-        result = "test_formset_layout lt50.html"
-    else:
-        result = "test_formset_layout.html"
+    result = "test_formset_layout.html"
     assert parse_expected(result) == parse_html(html)
 
 
@@ -259,12 +239,10 @@
 
 
 def test_i18n():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy form form.helper %}
-    """
-    )
+    """)
     form = SampleForm()
     form.helper.layout = Layout(
         HTML(_("i18n text")),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/tests/test_layout_objects.py 
new/django_crispy_forms-2.6/tests/test_layout_objects.py
--- old/django_crispy_forms-2.5/tests/test_layout_objects.py    2025-11-06 
21:43:49.000000000 +0100
+++ new/django_crispy_forms-2.6/tests/test_layout_objects.py    2026-03-01 
10:03:26.000000000 +0100
@@ -38,12 +38,10 @@
 
 
 def test_multiwidget_field():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy form %}
-    """
-    )
+    """)
 
     test_form = SampleForm()
     test_form.helper.layout = Layout(
@@ -65,12 +63,10 @@
 
 
 def test_field_type_hidden():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {% crispy test_form %}
-    """
-    )
+    """)
 
     test_form = SampleForm()
     test_form.helper.layout = Layout(
@@ -98,17 +94,13 @@
 
 def test_html_with_carriage_returns():
     test_form = SampleForm()
-    test_form.helper.layout = Layout(
-        HTML(
-            """
+    test_form.helper.layout = Layout(HTML("""
             if (a==b){
                 // some comment
                 a+1;
                 foo();
             }
-        """
-        )
-    )
+        """))
     html = render_crispy_form(test_form)
     assert html.count("\n") == 27
 
@@ -125,7 +117,7 @@
 
 def test_remove_labels():
     form = SampleForm()
-    # remove boolean field as label is still printed in boostrap
+    # remove boolean field as label is still printed in bootstrap
     del form.fields["is_company"]
 
     for fields in form:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/tests/test_tags.py 
new/django_crispy_forms-2.6/tests/test_tags.py
--- old/django_crispy_forms-2.5/tests/test_tags.py      2025-11-06 
21:43:49.000000000 +0100
+++ new/django_crispy_forms-2.6/tests/test_tags.py      2026-03-01 
10:03:26.000000000 +0100
@@ -2,6 +2,8 @@
 from django.forms.boundfield import BoundField
 from django.forms.formsets import formset_factory
 from django.template import Context, Template
+from django.test import override_settings
+from pytest_django.asserts import assertRaisesMessage
 
 from crispy_forms.exceptions import CrispyError
 from crispy_forms.templatetags.crispy_forms_field import crispy_addon
@@ -10,25 +12,21 @@
 
 
 def test_crispy_field():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_field %}
         {% for field in form %}
             {% crispy_field field %}
         {% endfor %}
-    """
-    )
+    """)
     html = template.render(Context({"form": SampleForm()}))
     assert html.count("<input") == 8
 
 
 def test_as_crispy_errors_form_without_non_field_errors():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {{ form|as_crispy_errors }}
-    """
-    )
+    """)
     form = SampleForm({"password1": "god", "password2": "god"})
     form.is_valid()
 
@@ -38,12 +36,10 @@
 
 
 def test_as_crispy_errors_form_with_non_field_errors():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {{ form|as_crispy_errors }}
-    """
-    )
+    """)
     form = SampleForm({"password1": "god", "password2": "wargame"})
     form.is_valid()
 
@@ -55,12 +51,10 @@
 
 
 def test_as_crispy_errors_formset_without_non_form_errors():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {{ formset|as_crispy_errors }}
-    """
-    )
+    """)
 
     SampleFormset = formset_factory(SampleForm, max_num=1, validate_max=True)
     formset = SampleFormset()
@@ -72,12 +66,10 @@
 
 
 def test_as_crispy_errors_formset_with_non_form_errors():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {{ formset|as_crispy_errors }}
-    """
-    )
+    """)
 
     SampleFormset = formset_factory(SampleForm, max_num=1, validate_max=True)
     formset = SampleFormset(
@@ -99,30 +91,31 @@
 
 
 def test_as_crispy_field_non_field(settings):
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {{ field|as_crispy_field }}
-    """
-    )
+    """)
 
     c = Context({"field": "notafield"})
 
     # Raises an AttributeError when trying to figure out how to render it
     # Not sure if this is expected behavior -- @kavdev
-    error_class = CrispyError if settings.DEBUG else AttributeError
-
-    with pytest.raises(error_class):
-        template.render(c)
+    with override_settings(DEBUG=True):
+        msg = "|as_crispy_field received invalid field: 'notafield'."
+        with assertRaisesMessage(CrispyError, msg):
+            template.render(c)
+
+    with override_settings(DEBUG=False):
+        msg = "'str' object has no attribute 'form'"
+        with assertRaisesMessage(AttributeError, msg):
+            template.render(c)
 
 
 def test_as_crispy_field_bound_field():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {{ field|as_crispy_field }}
-    """
-    )
+    """)
 
     form = SampleForm({"password1": "god", "password2": "god"})
     form.is_valid()
@@ -136,12 +129,10 @@
 
 
 def test_crispy_filter_with_form():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {{ form|crispy }}
-    """
-    )
+    """)
     c = Context({"form": SampleForm()})
     html = template.render(c)
 
@@ -151,12 +142,10 @@
 
 
 def test_crispy_filter_with_formset():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_tags %}
         {{ testFormset|crispy }}
-    """
-    )
+    """)
 
     SampleFormset = formset_factory(SampleForm, extra=4)
     testFormset = SampleFormset()
@@ -172,12 +161,10 @@
 
 
 def test_classes_filter():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_field %}
         {{ testField|classes }}
-    """
-    )
+    """)
 
     test_form = SampleForm()
     test_form.fields["email"].widget.attrs.update({"class": "email-fields"})
@@ -187,12 +174,10 @@
 
 
 def test_crispy_field_and_class_converters():
-    template = Template(
-        """
+    template = Template("""
         {% load crispy_forms_field %}
         {% crispy_field testField 'class' 'error' %}
-    """
-    )
+    """)
     test_form = SampleForm()
     field_instance = test_form.fields["email"]
     bound_field = BoundField(test_form, field_instance, "email")
@@ -216,3 +201,15 @@
         crispy_addon()
     with pytest.raises(TypeError):
         crispy_addon(bound_field)
+
+
+def test_crispy_missing_variable():
+    template = Template("{% load crispy_forms_tags %}{% crispy form %}")
+    html = template.render(Context({}))
+    assert html == ""
+
+
+def test_crispy_missing_variable_deep():
+    template = Template("{% load crispy_forms_tags %}{% crispy d.form %}")
+    html = template.render(Context({"d": None}))
+    assert html == ""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/tests/test_utils.py 
new/django_crispy_forms-2.6/tests/test_utils.py
--- old/django_crispy_forms-2.5/tests/test_utils.py     2025-11-06 
21:43:49.000000000 +0100
+++ new/django_crispy_forms-2.6/tests/test_utils.py     2026-03-01 
10:03:26.000000000 +0100
@@ -1,4 +1,3 @@
-import django
 import pytest
 from django import forms
 from django.conf import settings
@@ -144,10 +143,7 @@
     groups = optgroups(form["checkbox_select_multiple"])
     group = groups[0]
     label, option, index = group
-    if django.VERSION < (5, 0):
-        attrs = {"id": "id_checkbox_select_multiple_0", "checked": True}
-    else:
-        attrs = {"aria-invalid": "true", "checked": True, "id": 
"id_checkbox_select_multiple_0"}
+    attrs = {"aria-invalid": "true", "checked": True, "id": 
"id_checkbox_select_multiple_0"}
     assert label is None
     assert option == [
         {
@@ -189,10 +185,7 @@
     group = groups[0]
     label, option, index = group
     assert label is None
-    if django.VERSION < (5, 0):
-        attrs = {"id": "id_checkbox_select_multiple_0"}
-    else:
-        attrs = {"id": "id_checkbox_select_multiple_0", "aria-invalid": "true"}
+    attrs = {"id": "id_checkbox_select_multiple_0", "aria-invalid": "true"}
     assert option == [
         {
             "name": "checkbox_select_multiple",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django_crispy_forms-2.5/tox.ini 
new/django_crispy_forms-2.6/tox.ini
--- old/django_crispy_forms-2.5/tox.ini 2025-11-06 21:43:49.000000000 +0100
+++ new/django_crispy_forms-2.6/tox.ini 2026-03-01 10:03:26.000000000 +0100
@@ -1,17 +1,13 @@
 [tox]
 envlist =
-    {py39,py310,py311}-django{42},
-    {py310,py311}-django{50,51,52},
-    {py312}-django{50,51,52,60,-latest},
-    {py313}-django{51,52,60,-latest},
+    {py310,py311}-django{52},
+    {py312}-django{52,60,-latest},
+    {py313}-django{52,60,-latest},
     {py314}-django{52,60,-latest},
     lint
 
 [testenv]
 deps =
-    django42: django>=4.2a,<5.0
-    django50: django>=5.0a,<5.1
-    django51: django>=5.1a,<5.2
     django52: django>=5.2a,<6.0
     django60: django>=6.0a,<6.1
     django-latest: https://github.com/django/django/archive/main.tar.gz

Reply via email to