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