Fixed #25016 -- Reallowed non-ASCII values for ForeignKey.related_name on Python 3.

This commit is contained in:
薛丞宏 2015-06-23 14:08:12 +08:00 committed by Tim Graham
parent 60879a2193
commit d3e12c9017
4 changed files with 25 additions and 6 deletions

View File

@ -119,10 +119,18 @@ class RelatedField(Field):
import re import re
import keyword import keyword
related_name = self.remote_field.related_name related_name = self.remote_field.related_name
if not related_name:
is_valid_id = (related_name and re.match('^[a-zA-Z_][a-zA-Z0-9_]*$', related_name) return []
and not keyword.iskeyword(related_name)) is_valid_id = True
if related_name and not (is_valid_id or related_name.endswith('+')): if keyword.iskeyword(related_name):
is_valid_id = False
if six.PY3:
if not related_name.isidentifier():
is_valid_id = False
else:
if not re.match(r'^[a-zA-Z_][a-zA-Z0-9_]*\Z', related_name):
is_valid_id = False
if not (is_valid_id or related_name.endswith('+')):
return [ return [
checks.Error( checks.Error(
"The name '%s' is invalid related_name for field %s.%s" % "The name '%s' is invalid related_name for field %s.%s" %

View File

@ -82,3 +82,6 @@ Bugfixes
* Fixed a regression when deleting a model through the admin that has a * Fixed a regression when deleting a model through the admin that has a
``GenericRelation`` with a ``related_query_name`` (:ticket:`24940`). ``GenericRelation`` with a ``related_query_name`` (:ticket:`24940`).
* Reallowed non-ASCII values for ``ForeignKey.related_name`` on Python 3 by
fixing the false positive system check (:ticket:`25016`).

View File

@ -625,6 +625,7 @@ quo
quoteless quoteless
Radziej Radziej
rc rc
reallowed
rebase rebase
rebased rebased
rebasing rebasing

View File

@ -5,6 +5,7 @@ from django.core.checks import Error, Warning as DjangoWarning
from django.db import models from django.db import models
from django.test.testcases import skipIfDBFeature from django.test.testcases import skipIfDBFeature
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils import six
from .base import IsolatedModelsTestCase from .base import IsolatedModelsTestCase
@ -559,9 +560,12 @@ class RelativeFieldTests(IsolatedModelsTestCase):
'contains_%s_whitespace' % whitespace, 'contains_%s_whitespace' % whitespace,
'ends_with_with_illegal_non_alphanumeric_%s' % illegal_non_alphanumeric, 'ends_with_with_illegal_non_alphanumeric_%s' % illegal_non_alphanumeric,
'ends_with_whitespace_%s' % whitespace, 'ends_with_whitespace_%s' % whitespace,
# Python's keyword 'with', # a Python keyword
'with', 'related_name\n',
] ]
# Python 2 crashes on non-ASCII strings.
if six.PY3:
invalid_related_names.append('')
class Parent(models.Model): class Parent(models.Model):
pass pass
@ -600,6 +604,9 @@ class RelativeFieldTests(IsolatedModelsTestCase):
'_+', '_+',
'+', '+',
] ]
# Python 2 crashes on non-ASCII strings.
if six.PY3:
related_names.extend(['', '試驗+'])
class Parent(models.Model): class Parent(models.Model):
pass pass