Commit 2f9c4e2b authored by Vytis Banaitis's avatar Vytis Banaitis Committed by Tim Graham
Browse files

Fixed #19963 -- Added support for date_hierarchy across relations.

parent 89ca1128
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -840,12 +840,16 @@ class ModelAdminChecks(BaseModelAdminChecks):
            return []
        else:
            try:
                field = obj.model._meta.get_field(obj.date_hierarchy)
            except FieldDoesNotExist:
                return refer_to_missing_field(
                    option='date_hierarchy', field=obj.date_hierarchy,
                    model=obj.model, obj=obj, id='admin.E127',
                field = get_fields_from_path(obj.model, obj.date_hierarchy)[-1]
            except (NotRelationField, FieldDoesNotExist):
                return [
                    checks.Error(
                        "The value of 'date_hierarchy' refers to '%s', which "
                        "does not refer to a Field." % obj.date_hierarchy,
                        obj=obj.__class__,
                        id='admin.E127',
                    )
                ]
            else:
                if not isinstance(field, (models.DateField, models.DateTimeField)):
                    return must_be('a DateField or DateTimeField', option='date_hierarchy', obj=obj, id='admin.E128')
+3 −2
Original line number Diff line number Diff line
@@ -5,7 +5,8 @@ import warnings

from django.contrib.admin.templatetags.admin_urls import add_preserved_filters
from django.contrib.admin.utils import (
    display_for_field, display_for_value, label_for_field, lookup_field,
    display_for_field, display_for_value, get_fields_from_path,
    label_for_field, lookup_field,
)
from django.contrib.admin.views.main import (
    ALL_VAR, ORDER_VAR, PAGE_VAR, SEARCH_VAR,
@@ -346,7 +347,7 @@ def date_hierarchy(cl):
    """
    if cl.date_hierarchy:
        field_name = cl.date_hierarchy
        field = cl.opts.get_field(field_name)
        field = get_fields_from_path(cl.model, field_name)[-1]
        dates_or_datetimes = 'datetimes' if isinstance(field, models.DateTimeField) else 'dates'
        year_field = '%s__year' % field_name
        month_field = '%s__month' % field_name
+1 −1
Original line number Diff line number Diff line
@@ -393,7 +393,7 @@ with the admin site:
  which is not editable through the admin.
* **admin.E126**: The value of ``search_fields`` must be a list or tuple.
* **admin.E127**: The value of ``date_hierarchy`` refers to ``<field name>``,
  which is not an attribute of ``<model>``.
  which does not refer to a Field.
* **admin.E128**: The value of ``date_hierarchy`` must be a ``DateField`` or
  ``DateTimeField``.

+9 −0
Original line number Diff line number Diff line
@@ -213,10 +213,19 @@ subclass::

        date_hierarchy = 'pub_date'

    You can also specify a field on a related model using the ``__`` lookup,
    for example::

        date_hierarchy = 'author__pub_date'

    This will intelligently populate itself based on available data,
    e.g. if all the dates are in one month, it'll show the day-level
    drill-down only.

    .. versionchanged:: 1.11

        The ability to reference fields on related models was added.

    .. note::

        ``date_hierarchy`` uses :meth:`QuerySet.datetimes()
+1 −1
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ Minor features
:mod:`django.contrib.admin`
~~~~~~~~~~~~~~~~~~~~~~~~~~~

* ...
* :attr:`.ModelAdmin.date_hierarchy` can now reference fields across relations.

:mod:`django.contrib.admindocs`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Loading