@@ -97,10 +97,18 @@ def model_to_dict(instance, fields=None, exclude=None):
97
97
return data
98
98
99
99
100
+ def apply_limit_choices_to_to_formfield (formfield ):
101
+ """Apply limit_choices_to to the formfield's queryset if needed."""
102
+ if hasattr (formfield , 'queryset' ) and hasattr (formfield , 'get_limit_choices_to' ):
103
+ limit_choices_to = formfield .get_limit_choices_to ()
104
+ if limit_choices_to is not None :
105
+ formfield .queryset = formfield .queryset .complex_filter (limit_choices_to )
106
+
107
+
100
108
def fields_for_model (model , fields = None , exclude = None , widgets = None ,
101
109
formfield_callback = None , localized_fields = None ,
102
110
labels = None , help_texts = None , error_messages = None ,
103
- field_classes = None ):
111
+ field_classes = None , apply_limit_choices_to = True ):
104
112
"""
105
113
Returns a ``OrderedDict`` containing form fields for the given model.
106
114
@@ -127,6 +135,9 @@ def fields_for_model(model, fields=None, exclude=None, widgets=None,
127
135
128
136
``field_classes`` is a dictionary of model field names mapped to a form
129
137
field class.
138
+
139
+ ``apply_limit_choices_to`` is a boolean indicating if limit_choices_to
140
+ should be applied to a field's queryset.
130
141
"""
131
142
field_list = []
132
143
ignored = []
@@ -170,11 +181,8 @@ def fields_for_model(model, fields=None, exclude=None, widgets=None,
170
181
formfield = formfield_callback (f , ** kwargs )
171
182
172
183
if formfield :
173
- # Apply ``limit_choices_to``.
174
- if hasattr (formfield , 'queryset' ) and hasattr (formfield , 'get_limit_choices_to' ):
175
- limit_choices_to = formfield .get_limit_choices_to ()
176
- if limit_choices_to is not None :
177
- formfield .queryset = formfield .queryset .complex_filter (limit_choices_to )
184
+ if apply_limit_choices_to :
185
+ apply_limit_choices_to_to_formfield (formfield )
178
186
field_list .append ((f .name , formfield ))
179
187
else :
180
188
ignored .append (f .name )
@@ -245,11 +253,13 @@ def __new__(mcs, name, bases, attrs):
245
253
# fields from the model"
246
254
opts .fields = None
247
255
248
- fields = fields_for_model (opts .model , opts .fields , opts .exclude ,
249
- opts .widgets , formfield_callback ,
250
- opts .localized_fields , opts .labels ,
251
- opts .help_texts , opts .error_messages ,
252
- opts .field_classes )
256
+ fields = fields_for_model (
257
+ opts .model , opts .fields , opts .exclude , opts .widgets ,
258
+ formfield_callback , opts .localized_fields , opts .labels ,
259
+ opts .help_texts , opts .error_messages , opts .field_classes ,
260
+ # limit_choices_to will be applied during ModelForm.__init__().
261
+ apply_limit_choices_to = False ,
262
+ )
253
263
254
264
# make sure opts.fields doesn't specify an invalid field
255
265
none_model_fields = [k for k , v in six .iteritems (fields ) if not v ]
@@ -296,6 +306,8 @@ def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
296
306
data , files , auto_id , prefix , object_data , error_class ,
297
307
label_suffix , empty_permitted , use_required_attribute = use_required_attribute ,
298
308
)
309
+ for formfield in self .fields .values ():
310
+ apply_limit_choices_to_to_formfield (formfield )
299
311
300
312
def _get_validation_exclusions (self ):
301
313
"""
0 commit comments