django-crispy-forms / crispy-bootstrap4

Bootstrap 4 template pack for django-crispy-forms
MIT License
11 stars 5 forks source link

'BlankChoiceIterator' object has no attribute '__len__' crispy_field field 'class' 'custom-select' #24

Closed illgitthat closed 9 months ago

illgitthat commented 9 months ago

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:

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__'
smithdc1 commented 9 months ago

Closing as this is an issue in django-countries with django 5.0. See

https://github.com/SmileyChris/django-countries/issues/447