mirror of
https://github.com/django/django.git
synced 2025-10-30 09:06:13 +00:00
Fixed #21428 -- editable GenericRelation regression
The GenericRelation refactoring removed GenericRelations from model._meta.many_to_many. This had the side effect of disallowing editable GenericRelations in ModelForms. Editable GenericRelations aren't officially supported, but if we don't fix this we don't offer any upgrade path for those who used the ability to set editable=True in GenericRelation subclass. Thanks to Trac alias joshcartme for the report and stephencmd and Loic for working on this issue.
This commit is contained in:
@@ -39,6 +39,7 @@ class GenericForeignKey(six.with_metaclass(RenameGenericForeignKeyMethods)):
|
||||
self.ct_field = ct_field
|
||||
self.fk_field = fk_field
|
||||
self.for_concrete_model = for_concrete_model
|
||||
self.editable = False
|
||||
|
||||
def contribute_to_class(self, cls, name):
|
||||
self.name = name
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user