1515from django .db .models .fields import DateField
1616from django .forms .formsets import formset_factory , BaseFormSet
1717from functools import reduce
18+ from django .utils .functional import cached_property
1819from django .utils .text import capfirst
1920from django .utils .translation import gettext_lazy as _
2021
@@ -199,6 +200,14 @@ def get_form_kwargs(self, index):
199200 kwargs ['model_fields' ] = self .model_fields
200201 return kwargs
201202
203+ @cached_property
204+ def forms (self ):
205+ """Instantiate forms at first property access."""
206+ forms = super ().forms
207+ if self .extra > 0 and not self .data :
208+ forms += [self .empty_form ]
209+ return forms
210+
202211
203212AFQFormSet = formset_factory (
204213 AdvancedFilterQueryForm , formset = AdvancedFilterFormSet ,
@@ -221,6 +230,7 @@ class Media:
221230 'advanced-filters/jquery_adder.js' ,
222231 SELECT2_JS ,
223232 'magnific-popup/jquery.magnific-popup.js' ,
233+ 'admin/js/inlines.js' ,
224234 'advanced-filters/advanced-filters.js' ,
225235 ]
226236 js = required_js
@@ -289,23 +299,18 @@ def __init__(self, *args, **kwargs):
289299
290300 def clean (self ):
291301 cleaned_data = super ().clean ()
292- if not self .fields_formset .is_valid ():
293- logger .debug (
294- "Errors validating advanced query filters: %s" ,
295- pformat ([(f .errors , f .non_field_errors ())
296- for f in self .fields_formset .forms ]))
297- raise forms .ValidationError ("Error validating filter forms" )
298302 cleaned_data ['model' ] = "{}.{}" .format (self ._model ._meta .app_label ,
299303 self ._model ._meta .object_name )
300304 return cleaned_data
301305
302306 @property
303307 def _non_deleted_forms (self ):
304308 forms = []
305- for form in self .fields_formset .forms :
306- if form in self .fields_formset .deleted_forms :
307- continue # skip deleted forms when generating query
308- forms .append (form )
309+ if self .fields_formset .is_valid ():
310+ for form in self .fields_formset .forms :
311+ if form in self .fields_formset .deleted_forms :
312+ continue # skip deleted forms when generating query
313+ forms .append (form )
309314 return forms
310315
311316 def generate_query (self ):
@@ -345,6 +350,7 @@ def initialize_form(self, instance, model, data=None, extra=None):
345350 )
346351
347352 def save (self , commit = True ):
348- self .instance .query = self .generate_query ()
349- self .instance .model = self .cleaned_data .get ('model' )
353+ if self .is_valid ():
354+ self .instance .query = self .generate_query ()
355+ self .instance .model = self .cleaned_data .get ('model' )
350356 return super ().save (commit )
0 commit comments