Commit b28c6052 authored by anna's avatar anna Committed by Markus Holtermann
Browse files

Fixed #26101 -- Allowed introspection of base_field.model in RangeField

Used the same test and fix as in #25867.
This required initializing base_field in RangeField.__init__,
not when setting the attribute.
parent 319b7112
Loading
Loading
Loading
Loading
+23 −5
Original line number Diff line number Diff line
@@ -17,6 +17,24 @@ __all__ = [
class RangeField(models.Field):
    empty_strings_allowed = False

    def __init__(self, *args, **kwargs):
        # Initializing base_field here ensures that its model matches the model for self.
        if hasattr(self, 'base_field'):
            self.base_field = self.base_field()
        super(RangeField, self).__init__(*args, **kwargs)

    @property
    def model(self):
        try:
            return self.__dict__['model']
        except KeyError:
            raise AttributeError("'%s' object has no attribute 'model'" % self.__class__.__name__)

    @model.setter
    def model(self, model):
        self.__dict__['model'] = model
        self.base_field.model = model

    def get_prep_value(self, value):
        if value is None:
            return None
@@ -65,7 +83,7 @@ class RangeField(models.Field):


class IntegerRangeField(RangeField):
    base_field = models.IntegerField()
    base_field = models.IntegerField
    range_type = NumericRange
    form_field = forms.IntegerRangeField

@@ -74,7 +92,7 @@ class IntegerRangeField(RangeField):


class BigIntegerRangeField(RangeField):
    base_field = models.BigIntegerField()
    base_field = models.BigIntegerField
    range_type = NumericRange
    form_field = forms.IntegerRangeField

@@ -83,7 +101,7 @@ class BigIntegerRangeField(RangeField):


class FloatRangeField(RangeField):
    base_field = models.FloatField()
    base_field = models.FloatField
    range_type = NumericRange
    form_field = forms.FloatRangeField

@@ -92,7 +110,7 @@ class FloatRangeField(RangeField):


class DateTimeRangeField(RangeField):
    base_field = models.DateTimeField()
    base_field = models.DateTimeField
    range_type = DateTimeTZRange
    form_field = forms.DateTimeRangeField

@@ -101,7 +119,7 @@ class DateTimeRangeField(RangeField):


class DateRangeField(RangeField):
    base_field = models.DateField()
    base_field = models.DateField
    range_type = DateRange
    form_field = forms.DateRangeField

+1 −1
Original line number Diff line number Diff line
@@ -845,7 +845,7 @@ types.

    .. attribute:: base_field

        The model field to use.
        The model field class to use.

    .. attribute:: range_type

+6 −0
Original line number Diff line number Diff line
@@ -705,6 +705,12 @@ Miscellaneous
* :func:`django.views.i18n.set_language` may now return a 204 status code for
  AJAX requests.

* The ``base_field`` attribute of
  :class:`~django.contrib.postgres.fields.RangeField` is now a type of field,
  not an instance of a field.  If you have created a custom subclass of
  :class:`~django.contrib.postgres.fields.RangeField`, you should change the
  ``base_field`` attribute.

.. _deprecated-features-1.10:

Features deprecated in 1.10
+6 −0
Original line number Diff line number Diff line
@@ -80,6 +80,12 @@ class TestSaveLoad(PostgreSQLTestCase):
        loaded = RangesModel.objects.get()
        self.assertIsNone(loaded.ints)

    def test_model_set_on_base_field(self):
        instance = RangesModel()
        field = instance._meta.get_field('ints')
        self.assertEqual(field.model, RangesModel)
        self.assertEqual(field.base_field.model, RangesModel)


class TestQuerying(PostgreSQLTestCase):