summaryrefslogtreecommitdiff
path: root/django/forms
diff options
context:
space:
mode:
Diffstat (limited to 'django/forms')
-rw-r--r--django/forms/models.py15
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