[1.8.x] Fixed #25016 -- Reallowed non-ASCII values for ForeignKey.related_name on Python 3.
Backport of d3e12c9017
from master
This commit is contained in:
parent
ae93aeed2b
commit
a97e50c5e6
|
@ -122,10 +122,18 @@ class RelatedField(Field):
|
||||||
import re
|
import re
|
||||||
import keyword
|
import keyword
|
||||||
related_name = self.rel.related_name
|
related_name = self.rel.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" %
|
||||||
|
|
|
@ -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`).
|
||||||
|
|
|
@ -511,6 +511,7 @@ Quickstart
|
||||||
quoteless
|
quoteless
|
||||||
Radziej
|
Radziej
|
||||||
rc
|
rc
|
||||||
|
reallowed
|
||||||
rebase
|
rebase
|
||||||
rebased
|
rebased
|
||||||
rebasing
|
rebasing
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue