diff options
Diffstat (limited to 'django/forms')
| -rw-r--r-- | django/forms/models.py | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/django/forms/models.py b/django/forms/models.py index 6d9a567926..610a2a176a 100644 --- a/django/forms/models.py +++ b/django/forms/models.py @@ -83,7 +83,12 @@ def save_instance(form, instance, fields=None, fail_message='saved', # Wrap up the saving of m2m data as a function. def save_m2m(): cleaned_data = form.cleaned_data - for f in opts.many_to_many: + # Note that for historical reasons we want to include also + # virtual_fields here. (GenericRelation was previously a fake + # m2m field). + for f in opts.many_to_many + opts.virtual_fields: + if not hasattr(f, 'save_form_data'): + continue if fields and f.name not in fields: continue if exclude and f.name in exclude: @@ -119,8 +124,8 @@ def model_to_dict(instance, fields=None, exclude=None): from django.db.models.fields.related import ManyToManyField opts = instance._meta data = {} - for f in opts.concrete_fields + opts.many_to_many: - if not f.editable: + for f in opts.concrete_fields + opts.virtual_fields + opts.many_to_many: + if not getattr(f, 'editable', False): continue if fields and not f.name in fields: continue @@ -174,8 +179,8 @@ def fields_for_model(model, fields=None, exclude=None, widgets=None, field_list = [] ignored = [] opts = model._meta - for f in sorted(opts.concrete_fields + opts.many_to_many): - if not f.editable: + for f in sorted(opts.concrete_fields + opts.virtual_fields + opts.many_to_many): + if not getattr(f, 'editable', False): continue if fields is not None and not f.name in fields: continue |
