1
0
mirror of https://github.com/django/django.git synced 2025-10-31 09:41:08 +00:00

[2.2.x] Fixed #30254 -- Allowed model metaclasses to access the attribute dict in __init__().

Regression in a68ea23101.

Backport of 58ad030d05 from master.
This commit is contained in:
Matt Westcott
2019-03-14 18:23:50 +01:00
committed by Tim Graham
parent d8704a4d4f
commit 985e6c224b
2 changed files with 27 additions and 5 deletions

View File

@@ -84,9 +84,12 @@ class ModelBase(type):
# Pass all attrs without a (Django-specific) contribute_to_class()
# method to type.__new__() so that they're properly initialized
# (i.e. __set_name__()).
contributable_attrs = {}
for obj_name, obj in list(attrs.items()):
if not _has_contribute_to_class(obj):
new_attrs[obj_name] = attrs.pop(obj_name)
if _has_contribute_to_class(obj):
contributable_attrs[obj_name] = obj
else:
new_attrs[obj_name] = obj
new_class = super_new(cls, name, bases, new_attrs, **kwargs)
abstract = getattr(attr_meta, 'abstract', False)
@@ -146,8 +149,9 @@ class ModelBase(type):
if is_proxy and base_meta and base_meta.swapped:
raise TypeError("%s cannot proxy the swapped model '%s'." % (name, base_meta.swapped))
# Add all attributes to the class.
for obj_name, obj in attrs.items():
# Add remaining attributes (those with a contribute_to_class() method)
# to the class.
for obj_name, obj in contributable_attrs.items():
new_class.add_to_class(obj_name, obj)
# All the fields of any type declared on this model