I believe this is related to crispy-bootstrap4 instead of django-crispy-forms itself, but I'm not sure.
This works with:
Django 4.2.6
Crispy 2.1
Crispy-bootstrap4 2023.1
Fails with:
Django 5.0
Crispy 2.1
Crispy-bootstrap4 2023.1
Let me know if I can provide additional context here.
Traceback:
Environment:
Request Method: GET
Request URL: http://localhost:8000/
Django Version: 5.0
Python Version: 3.12.0
Installed Applications:
['crispy_forms',
'crispy_bootstrap4',
'luminaria.apps.LuminariaConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
'watson',
'anymail',
'django_countries',
'easy_thumbnails',
'import_export']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.middleware.cache.UpdateCacheMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
'watson.middleware.SearchContextMiddleware']
Template error:
In template /home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_bootstrap4/templates/bootstrap4/field.html, error at line 55
'BlankChoiceIterator' object has no attribute '__len__'
45 : </label>
46 : {% include 'bootstrap4/layout/help_text_and_errors.html' %}
47 : {% elif field|is_file and use_custom_control %}
48 : {% include 'bootstrap4/layout/field_file.html' %}
49 : {% else %}
50 : <div{% if field_class %} class="{{ field_class }}"{% endif %}>
51 : {% if field|is_select and use_custom_control %}
52 : {% if field.errors %}
53 : {% crispy_field field 'class' 'custom-select is-invalid' %}
54 : {% else %}
55 : {% crispy_field field 'class' 'custom-select' %}
56 : {% endif %}
57 : {% elif field|is_file %}
58 : {% if field.errors %}
59 : {% crispy_field field 'class' 'form-control-file is-invalid' %}
60 : {% else %}
61 : {% crispy_field field 'class' 'form-control-file' %}
62 : {% endif %}
63 : {% else %}
64 : {% if field.errors %}
65 : {% crispy_field field 'class' 'form-control is-invalid' %}
Traceback (most recent call last):
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/utils/decorators.py", line 188, in _view_wrapper
result = _process_exception(request, e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/utils/decorators.py", line 186, in _view_wrapper
response = view_func(request, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/utils/decorators.py", line 188, in _view_wrapper
result = _process_exception(request, e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/utils/decorators.py", line 186, in _view_wrapper
response = view_func(request, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/LUTG/luminaria/views.py", line 79, in index
return render(request, "luminaria/index.html", context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/shortcuts.py", line 24, in render
content = loader.render_to_string(template_name, context, request, using=using)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/loader.py", line 62, in render_to_string
return template.render(context, request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/backends/django.py", line 61, in render
return self.template.render(context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 171, in render
return self._render(context)
^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 163, in _render
return self.nodelist.render(context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 1000, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 961, in render_annotated
return self.render(context)
^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render
return compiled_parent._render(context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 163, in _render
return self.nodelist.render(context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 1000, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 961, in render_annotated
return self.render(context)
^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render
result = block.nodelist.render(context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 1000, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 961, in render_annotated
return self.render(context)
^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/templatetags/crispy_forms_tags.py", line 199, in render
c = self.get_render(context).flatten()
^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/templatetags/crispy_forms_tags.py", line 117, in get_render
actual_form.form_html = helper.render_layout(
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/helper.py", line 276, in render_layout
html = self.layout.render(form, context, template_pack=template_pack)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/layout.py", line 142, in render
return self.get_rendered_fields(form, context, template_pack, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/layout.py", line 105, in get_rendered_fields
"".join(render_field(field, form, context, template_pack=template_pack, **kwargs) for field in self.fields)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/layout.py", line 105, in <genexpr>
"".join(render_field(field, form, context, template_pack=template_pack, **kwargs) for field in self.fields)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/utils.py", line 65, in render_field
return field.render(form, context, template_pack=template_pack)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/layout.py", line 747, in render
fields = self.get_rendered_fields(form, context, template_pack, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/layout.py", line 105, in get_rendered_fields
"".join(render_field(field, form, context, template_pack=template_pack, **kwargs) for field in self.fields)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/layout.py", line 105, in <genexpr>
"".join(render_field(field, form, context, template_pack=template_pack, **kwargs) for field in self.fields)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/utils.py", line 65, in render_field
return field.render(form, context, template_pack=template_pack)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/layout.py", line 747, in render
fields = self.get_rendered_fields(form, context, template_pack, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/layout.py", line 105, in get_rendered_fields
"".join(render_field(field, form, context, template_pack=template_pack, **kwargs) for field in self.fields)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/layout.py", line 105, in <genexpr>
"".join(render_field(field, form, context, template_pack=template_pack, **kwargs) for field in self.fields)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/utils.py", line 137, in render_field
html = template.render(context.flatten())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/backends/django.py", line 61, in render
return self.template.render(context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 171, in render
return self._render(context)
^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 163, in _render
return self.nodelist.render(context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 1000, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 961, in render_annotated
return self.render(context)
^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/defaulttags.py", line 325, in render
return nodelist.render(context)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 1000, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 961, in render_annotated
return self.render(context)
^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/defaulttags.py", line 325, in render
return nodelist.render(context)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 1000, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 961, in render_annotated
return self.render(context)
^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/defaulttags.py", line 325, in render
return nodelist.render(context)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 1000, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 961, in render_annotated
return self.render(context)
^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/defaulttags.py", line 325, in render
return nodelist.render(context)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 1000, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 961, in render_annotated
return self.render(context)
^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/defaulttags.py", line 325, in render
return nodelist.render(context)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 1000, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/template/base.py", line 961, in render_annotated
return self.render(context)
^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/crispy_forms/templatetags/crispy_forms_field.py", line 125, in render
return str(field)
^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/forms/utils.py", line 79, in __str__
return self.as_widget()
^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/forms/boundfield.py", line 95, in as_widget
attrs = self.build_widget_attrs(attrs, widget)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/forms/boundfield.py", line 270, in build_widget_attrs
widget.use_required_attribute(self.initial)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/forms/widgets.py", line 781, in use_required_attribute
first_choice = next(iter(self.choices), None)
^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django_countries/widgets.py", line 29, in get_choices
self._choices: ChoiceList = list(self._choices)
^^^^^^^^^^^^^^^^^^^
File "/home/adam/.local/share/virtualenvs/LUTG-SPtF_xKS/lib/python3.12/site-packages/django/utils/functional.py", line 188, in __wrapper__
return getattr(result, __method_name)(*args, **kw)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Exception Type: AttributeError at /
Exception Value: 'BlankChoiceIterator' object has no attribute '__len__'
I believe this is related to crispy-bootstrap4 instead of django-crispy-forms itself, but I'm not sure.
This works with:
Fails with:
Let me know if I can provide additional context here.
Traceback: