Commit a97e50c5 authored by 薛丞宏's avatar 薛丞宏 Committed by Tim Graham
Browse files

[1.8.x] Fixed #25016 -- Reallowed non-ASCII values for ForeignKey.related_name on Python 3.

Backport of d3e12c90 from master
parent ae93aeed
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -122,10 +122,18 @@ class RelatedField(Field):
        import re
        import keyword
        related_name = self.rel.related_name

        is_valid_id = (related_name and re.match('^[a-zA-Z_][a-zA-Z0-9_]*$', related_name)
                       and not keyword.iskeyword(related_name))
        if related_name and not (is_valid_id or related_name.endswith('+')):
        if not related_name:
            return []
        is_valid_id = True
        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 [
                checks.Error(
                    "The name '%s' is invalid related_name for field %s.%s" %
+3 −0
Original line number Diff line number Diff line
@@ -82,3 +82,6 @@ Bugfixes

* Fixed a regression when deleting a model through the admin that has a
  ``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`).
+1 −0
Original line number Diff line number Diff line
@@ -511,6 +511,7 @@ Quickstart
quoteless
Radziej
rc
reallowed
rebase
rebased
rebasing
+9 −2
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ from django.core.checks import Error, Warning as DjangoWarning
from django.db import models
from django.test.testcases import skipIfDBFeature
from django.test.utils import override_settings
from django.utils import six

from .base import IsolatedModelsTestCase

@@ -559,9 +560,12 @@ class RelativeFieldTests(IsolatedModelsTestCase):
            'contains_%s_whitespace' % whitespace,
            'ends_with_with_illegal_non_alphanumeric_%s' % illegal_non_alphanumeric,
            'ends_with_whitespace_%s' % whitespace,
            # Python's keyword
            'with',
            'with',  # a Python keyword
            'related_name\n',
        ]
        # Python 2 crashes on non-ASCII strings.
        if six.PY3:
            invalid_related_names.append('')

        class Parent(models.Model):
            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):
            pass