modlinltd/django-advanced-filters

builtins.AttributeError: 'AdvancedFilterQueryForm' object has no attribute 'cleaned_data'

boatcoder opened this issue · 3 comments

Describe the bug
Throws an exception when I try to save and filter a super simple filter
Stacktrace below

To Reproduce
Steps to reproduce the behavior:

  1. built filter like this. self.advanced_filter_fields = [field.name for field in self.model._meta.fields]
  2. Opened admin advanced Filter
  3. Put in values (see screenshot)
  4. Clicked save and filter

Expected behavior
Doesn't blow up

Screenshots
Screen Shot 2022-03-29 at 5 18 46 PM

Details (please complete the following information):

  • OS: MacOS 12.2.1 (21D62)
  • Python version 3.10.2
  • Django version (3, 2, 12, 'final', 0)
  • django-advanced-filters version 1.4.0
  • Browser Chrome but not important
  • Version Version 99.0.4844.84 (Official Build) (arm64)

Additional context

File "/opt/homebrew/Cellar/python@3.10/3.10.2/Frameworks/Python.framework/Versions/3.10/lib/python3.10/threading.py", line 966, in _bootstrap
  self._bootstrap_inner()
File "/opt/homebrew/Cellar/python@3.10/3.10.2/Frameworks/Python.framework/Versions/3.10/lib/python3.10/threading.py", line 1009, in _bootstrap_inner
  self.run()
File "/opt/homebrew/Cellar/python@3.10/3.10.2/Frameworks/Python.framework/Versions/3.10/lib/python3.10/threading.py", line 946, in run
  self._target(*self._args, **self._kwargs)
File "/opt/homebrew/Cellar/python@3.10/3.10.2/Frameworks/Python.framework/Versions/3.10/lib/python3.10/socketserver.py", line 683, in process_request_thread
  self.finish_request(request, client_address)
File "/opt/homebrew/Cellar/python@3.10/3.10.2/Frameworks/Python.framework/Versions/3.10/lib/python3.10/socketserver.py", line 360, in finish_request
  self.RequestHandlerClass(request, client_address, self)
File "/opt/homebrew/Cellar/python@3.10/3.10.2/Frameworks/Python.framework/Versions/3.10/lib/python3.10/socketserver.py", line 747, in __init__
  self.handle()
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/servers/basehttp.py", line 178, in handle
  self.handle_one_request()
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/servers/basehttp.py", line 201, in handle_one_request
  handler.run(self.server.get_app())
File "/opt/homebrew/Cellar/python@3.10/3.10.2/Frameworks/Python.framework/Versions/3.10/lib/python3.10/wsgiref/handlers.py", line 137, in run
  self.result = application(self.environ, self.start_response)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/contrib/staticfiles/handlers.py", line 76, in __call__
  return self.application(environ, start_response)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/wsgi.py", line 133, in __call__
  response = self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/base.py", line 130, in get_response
  response = self._middleware_chain(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
  response = get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/middleware.py", line 57, in __call__
  response = toolbar.process_request(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/__init__.py", line 193, in process_request
  return self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/__init__.py", line 193, in process_request
  return self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/timer.py", line 65, in process_request
  return super().process_request(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/__init__.py", line 193, in process_request
  return self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/__init__.py", line 193, in process_request
  return self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/headers.py", line 50, in process_request
  return super().process_request(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/__init__.py", line 193, in process_request
  return self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/__init__.py", line 193, in process_request
  return self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/__init__.py", line 193, in process_request
  return self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/staticfiles.py", line 117, in process_request
  return super().process_request(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/__init__.py", line 193, in process_request
  return self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/__init__.py", line 193, in process_request
  return self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/__init__.py", line 193, in process_request
  return self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/__init__.py", line 193, in process_request
  return self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/logging.py", line 77, in process_request
  return super().process_request(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/debug_toolbar/panels/__init__.py", line 193, in process_request
  return self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
  response = get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/utils/deprecation.py", line 117, in __call__
  response = response or self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
  response = get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/utils/deprecation.py", line 117, in __call__
  response = response or self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
  response = get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/utils/deprecation.py", line 117, in __call__
  response = response or self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
  response = get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/utils/deprecation.py", line 117, in __call__
  response = response or self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
  response = get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/utils/deprecation.py", line 117, in __call__
  response = response or self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
  response = get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/utils/deprecation.py", line 117, in __call__
  response = response or self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
  response = get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/utils/deprecation.py", line 117, in __call__
  response = response or self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
  response = get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/utils/deprecation.py", line 117, in __call__
  response = response or self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
  response = get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/utils/deprecation.py", line 117, in __call__
  response = response or self.get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/exception.py", line 49, in inner
  response = response_for_exception(request, exc)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/exception.py", line 115, in response_for_exception
  log_response(
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/utils/log.py", line 224, in log_response
  getattr(logger, level)(
File "/opt/homebrew/Cellar/python@3.10/3.10.2/Frameworks/Python.framework/Versions/3.10/lib/python3.10/logging/__init__.py", line 70, in error
File "/opt/homebrew/Cellar/python@3.10/3.10.2/Frameworks/Python.framework/Versions/3.10/lib/python3.10/logging/__init__.py", line 1904, in _LogErrorReplacement
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
  response = get_response(request)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/core/handlers/base.py", line 181, in _get_response
  response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/contrib/admin/options.py", line 616, in wrapper
  return self.admin_site.admin_view(view)(*args, **kwargs)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/utils/decorators.py", line 130, in _wrapped_view
  response = view_func(request, *args, **kwargs)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
  response = view_func(request, *args, **kwargs)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/contrib/admin/sites.py", line 232, in inner
  return view(request, *args, **kwargs)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/advanced_filters/admin.py", line 102, in changelist_view
  response = self.save_advanced_filter(request, form)
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/advanced_filters/admin.py", line 65, in save_advanced_filter
  if form.is_valid():
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/forms/forms.py", line 175, in is_valid
  return self.is_bound and not self.errors
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/forms/forms.py", line 170, in errors
  self.full_clean()
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/forms/forms.py", line 373, in full_clean
  self._clean_form()
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/forms/forms.py", line 400, in _clean_form
  cleaned_data = self.clean()
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/advanced_filters/forms.py", line 309, in clean
  if not self.fields_formset.is_valid():
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/forms/formsets.py", line 321, in is_valid
  self.errors
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/forms/formsets.py", line 304, in errors
  self.full_clean()
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/forms/formsets.py", line 362, in full_clean
  if self.can_delete and self._should_delete_form(form):
File "/Users/mark/.virtualenvs/dubclub/lib/python3.10/site-packages/django/forms/formsets.py", line 314, in _should_delete_form
  return form.cleaned_data.get(DELETION_FIELD_NAME, False)

builtins.AttributeError: 'AdvancedFilterQueryForm' object has no attribute 'cleaned_data'

I've got the same issue with the same tback

  • OS: MacOS 12.3.1 arm64
  • Python version 3.9.12
  • Django version 3.2.13
  • django-advanced-filters version 1.4.0
  • Firefox 100

There is a PR #153

Just looking at the screenshot, this looks like this is caused by an empty option being allowed to pass validation. Is it true that this used to work well in older versions? What used to happen then?

EDIT: this is possibly a duplicate of #141, however it's not very clear what is the desired behaviour (or what used to happen in Django < 3.2)