summaryrefslogtreecommitdiff
path: root/django/forms
diff options
context:
space:
mode:
authortaulant <taliraj@outlook.com>2021-08-30 17:44:22 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-09-03 06:48:32 +0200
commit0e8be73812a6e62d5a6b12a585d133b56bc2bf52 (patch)
tree37e31a58d4eca2dd7b82dd5bab998fcfc5a15e67 /django/forms
parentb8824e8d17434957650517370f739e340867c381 (diff)
Fixed #32975 -- Fixed admin system check for inlines with foreign keys to proxy models.
Diffstat (limited to 'django/forms')
-rw-r--r--django/forms/models.py20
1 files changed, 16 insertions, 4 deletions
diff --git a/django/forms/models.py b/django/forms/models.py
index a88c384841..16681ba80b 100644
--- a/django/forms/models.py
+++ b/django/forms/models.py
@@ -1009,9 +1009,17 @@ def _get_foreign_key(parent_model, model, fk_name=None, can_fail=False):
fks_to_parent = [f for f in opts.fields if f.name == fk_name]
if len(fks_to_parent) == 1:
fk = fks_to_parent[0]
- if not isinstance(fk, ForeignKey) or \
- (fk.remote_field.model != parent_model and
- fk.remote_field.model not in parent_model._meta.get_parent_list()):
+ parent_list = parent_model._meta.get_parent_list()
+ if not isinstance(fk, ForeignKey) or (
+ # ForeignKey to proxy models.
+ fk.remote_field.model._meta.proxy and
+ fk.remote_field.model._meta.proxy_for_model not in parent_list
+ ) or (
+ # ForeignKey to concrete models.
+ not fk.remote_field.model._meta.proxy and
+ fk.remote_field.model != parent_model and
+ fk.remote_field.model not in parent_list
+ ):
raise ValueError(
"fk_name '%s' is not a ForeignKey to '%s'." % (fk_name, parent_model._meta.label)
)
@@ -1021,11 +1029,15 @@ def _get_foreign_key(parent_model, model, fk_name=None, can_fail=False):
)
else:
# Try to discover what the ForeignKey from model to parent_model is
+ parent_list = parent_model._meta.get_parent_list()
fks_to_parent = [
f for f in opts.fields
if isinstance(f, ForeignKey) and (
f.remote_field.model == parent_model or
- f.remote_field.model in parent_model._meta.get_parent_list()
+ f.remote_field.model in parent_list or (
+ f.remote_field.model._meta.proxy and
+ f.remote_field.model._meta.proxy_for_model in parent_list
+ )
)
]
if len(fks_to_parent) == 1: