Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Changed r10668 to not falsely error out when using generic inlines.

The bug was picked up by the tests already, but only if run against a
backend that supports referential integrity.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10732 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit fe971ec66f5d42945b2583037303be31f53ea524 1 parent 8c2db4a
Malcolm Tredinnick malcolmt authored
Showing with 11 additions and 6 deletions.
  1. +3 −3 django/contrib/admin/validation.py
  2. +8 −3 django/forms/models.py
6 django/contrib/admin/validation.py
View
@@ -169,11 +169,11 @@ def validate_inline(cls, parent, parent_model):
# exclude
if hasattr(cls, 'exclude') and cls.exclude:
- fk_name = _get_foreign_key(parent_model, cls.model).name
- if fk_name in cls.exclude:
+ fk = _get_foreign_key(parent_model, cls.model, can_fail=True)
+ if fk and fk.name in cls.exclude:
raise ImproperlyConfigured("%s cannot exclude the field "
"'%s' - this is the foreign key to the parent model "
- "%s." % (cls.__name__, fk_name, parent_model.__name__))
+ "%s." % (cls.__name__, fk.name, parent_model.__name__))
def validate_base(cls, model):
opts = model._meta
11 django/forms/models.py
View
@@ -756,10 +756,13 @@ def get_unique_error_message(self, unique_check):
unique_check = [field for field in unique_check if field != self.fk.name]
return super(BaseInlineFormSet, self).get_unique_error_message(unique_check)
-def _get_foreign_key(parent_model, model, fk_name=None):
+def _get_foreign_key(parent_model, model, fk_name=None, can_fail=False):
"""
- Finds and returns the ForeignKey from model to parent if there is one.
- If fk_name is provided, assume it is the name of the ForeignKey field.
+ Finds and returns the ForeignKey from model to parent if there is one
+ (returns None if can_fail is True and no such field exists). If fk_name is
+ provided, assume it is the name of the ForeignKey field. Unles can_fail is
+ True, an exception is raised if there is no ForeignKey from model to
+ parent_model.
"""
# avoid circular import
from django.db.models import ForeignKey
@@ -785,6 +788,8 @@ def _get_foreign_key(parent_model, model, fk_name=None):
if len(fks_to_parent) == 1:
fk = fks_to_parent[0]
elif len(fks_to_parent) == 0:
+ if can_fail:
+ return
raise Exception("%s has no ForeignKey to %s" % (model, parent_model))
else:
raise Exception("%s has more than 1 ForeignKey to %s" % (model, parent_model))
Please sign in to comment.
Something went wrong with that request. Please try again.