Vistas de fechas genéricas

Las vistas basadas en fechas, proporcionadas en django.views.generic.dates, son vistas para mostrar páginas de «drilldown» para datos basados en fechas.

Nota

Algunos ejemplos de esta página suponen que un modelo Article ha sido definido como sigue en myapp/models.py:

from django.db import models
from django.urls import reverse


class Article(models.Model):
    title = models.CharField(max_length=200)
    pub_date = models.DateField()

    def get_absolute_url(self):
        return reverse("article-detail", kwargs={"pk": self.pk})

ArchivoIndexView

class ArchiveIndexView[fuente]

Una página de índice a nivel superior que muestra los «últimos» objetos, por fecha. Los objetos con una fecha en el futuro no se incluyen a menos que establezcas allow_future en True.

Ancestros (MRO)

Contexto

Además del contexto proporcionado por django.views.generic.list.MultipleObjectMixin (a través de django.views.generic.dates.BaseDateListView), el contexto del template será:

  • date_list: Un objeto QuerySet que contiene todos los años que tienen objetos disponibles según queryset, representados como objetos datetime.datetime, en orden descendente.

Notas

  • Utiliza un nombre de objeto de contexto predeterminado de latest.

  • Utiliza un sufijo de nombre del template predeterminado de _archive.

  • Por defecto, proporciona date_list por año, pero esto se puede alterar a mes o día utilizando la atributo date_list_period. Esto también se aplica a todas las vistas heredadas.

Ejemplo myapp/urls.py:

from django.urls import path
from django.views.generic.dates import ArchiveIndexView

from myapp.models import Article

urlpatterns = [
    path(
        "archive/",
        ArchiveIndexView.as_view(model=Article, date_field="pub_date"),
        name="article_archive",
    ),
]

Ejemplo myapp/article_archive.html:

<ul>
    {% for article in latest %}
        <li>{{ article.pub_date }}: {{ article.title }}</li>
    {% endfor %}
</ul>

Esta será la salida de todos los artículos.

Fecha de archivo del año

class YearArchiveView[fuente]

Una página de archivo anual que muestra todos los meses disponibles en un año determinado. Los objetos con una fecha en el futuro no se muestran a menos que establezcas allow_future en True.

Ancestros (MRO)

make_object_list

Un booleano que especifica si se debe recuperar la lista completa de objetos para este año y pasar esos a la plantilla. Si True, la lista de objetos estará disponible en el contexto. Si False, se utilizará el conjunto de consultas vacío como lista de objetos. Por defecto, esto es False.

get_make_object_list()

Determina si una lista de objetos se devolverá como parte del contexto. Devuelve make_object_list por defecto.

Contexto

Además del contexto proporcionado por django.views.generic.list.MultipleObjectMixin (a través de django.views.generic.dates.BaseDateListView), el contexto del template será:

  • date_list: Un objeto QuerySet que contiene todos los meses que tienen objetos disponibles según queryset, representados como objetos datetime.datetime, en orden ascendente.

  • year: Un objeto date que representa el año dado.

  • next_year: Un objeto date que representa el primer día del próximo año, según allow_empty y allow_future.

  • previous_year: Un objeto date que representa el primer día del año anterior, según allow_empty y allow_future.

Notas

  • Usa un sufijo de nombre de plantilla por defecto _archive_year.

Ejemplo myapp/views.py:

from django.views.generic.dates import YearArchiveView

from myapp.models import Article


class ArticleYearArchiveView(YearArchiveView):
    queryset = Article.objects.all()
    date_field = "pub_date"
    make_object_list = True
    allow_future = True

Ejemplo myapp/urls.py:

from django.urls import path

from myapp.views import ArticleYearArchiveView

urlpatterns = [
    path("<int:year>/", ArticleYearArchiveView.as_view(), name="article_year_archive"),
]

Ejemplo myapp/article_archive_year.html:

<ul>
    {% for date in date_list %}
        <li>{{ date|date }}</li>
    {% endfor %}
</ul>

<div>
    <h1>All Articles for {{ year|date:"Y" }}</h1>
    {% for obj in object_list %}
        <p>
            {{ obj.title }} - {{ obj.pub_date|date:"F j, Y" }}
        </p>
    {% endfor %}
</div>

Fecha de archivo del mes

class MonthArchiveView[fuente]

Una página de archivo mensual que muestra todos los objetos en un mes determinado. Los objetos con una fecha en el futuro no se muestran a menos que establezcas allow_future en True.

Ancestros (MRO)

Contexto

Además del contexto proporcionado por MultipleObjectMixin (a través de BaseDateListView), el contexto del template será:

  • date_list: Un objeto QuerySet que contiene todos los días que tienen objetos disponibles en el mes dado, según queryset, representados como objetos datetime.datetime, en orden ascendente.

  • month: Un objeto date que representa el mes dado.

  • next_month: Un objeto date que representa el primer día del siguiente mes, según allow_empty y allow_future.

  • previous_month: Un objeto de tipo date que representa el primer día del mes anterior, según allow_empty y allow_future.

Notas

  • Se utiliza un sufijo por defecto template_name_suffix de _archive_month.

Ejemplo myapp/views.py:

from django.views.generic.dates import MonthArchiveView

from myapp.models import Article


class ArticleMonthArchiveView(MonthArchiveView):
    queryset = Article.objects.all()
    date_field = "pub_date"
    allow_future = True

Ejemplo myapp/urls.py:

from django.urls import path

from myapp.views import ArticleMonthArchiveView

urlpatterns = [
    # Example: /2012/08/
    path(
        "<int:year>/<int:month>/",
        ArticleMonthArchiveView.as_view(month_format="%m"),
        name="archive_month_numeric",
    ),
    # Example: /2012/aug/
    path(
        "<int:year>/<str:month>/",
        ArticleMonthArchiveView.as_view(),
        name="archive_month",
    ),
]

Ejemplo myapp/article_archive_month.html:

<ul>
    {% for article in object_list %}
        <li>{{ article.pub_date|date:"F j, Y" }}: {{ article.title }}</li>
    {% endfor %}
</ul>

<p>
    {% if previous_month %}
        Previous Month: {{ previous_month|date:"F Y" }}
    {% endif %}
    {% if next_month %}
        Next Month: {{ next_month|date:"F Y" }}
    {% endif %}
</p>

Vista de archivo semanal

class WeekArchiveView[fuente]

Una página de archivo semanal que muestra todos los objetos en una semana determinada. Los objetos con una fecha en el futuro no se muestran a menos que establezcas allow_future en True.

Ancestros (MRO)

Contexto

Además del contexto proporcionado por MultipleObjectMixin (a través de BaseDateListView), el contexto del template será:

  • week: Un objeto de tipo date que representa el primer día de la semana dada.

  • next_week: Un objeto de tipo date que representa el primer día de la siguiente semana, según allow_empty y allow_future.

  • previous_week: Un objeto de tipo date que representa el primer día de la semana anterior, según allow_empty y allow_future.

Notas

  • Se utiliza un sufijo por defecto template_name_suffix de _archive_week.

  • El week_format attribute es una cadena de formato para la función strptime() utilizada para parsear el número de semana. Los siguientes valores están soportados:

    • '%U': Basado en el sistema de semanas de los Estados Unidos donde la semana comienza el domingo. Este es el valor por defecto.

    • '%W': Similar a '%U', excepto que asume que la semana comienza el lunes. Esto no es lo mismo que el número de semana ISO 8601.

    • '%V': Número de semana ISO 8601 donde la semana comienza el lunes.

Ejemplo myapp/views.py:

from django.views.generic.dates import WeekArchiveView

from myapp.models import Article


class ArticleWeekArchiveView(WeekArchiveView):
    queryset = Article.objects.all()
    date_field = "pub_date"
    week_format = "%W"
    allow_future = True

Ejemplo myapp/urls.py:

from django.urls import path

from myapp.views import ArticleWeekArchiveView

urlpatterns = [
    # Example: /2012/week/23/
    path(
        "<int:year>/week/<int:week>/",
        ArticleWeekArchiveView.as_view(),
        name="archive_week",
    ),
]

Ejemplo myapp/article_archive_week.html:

<h1>Week {{ week|date:'W' }}</h1>

<ul>
    {% for article in object_list %}
        <li>{{ article.pub_date|date:"F j, Y" }}: {{ article.title }}</li>
    {% endfor %}
</ul>

<p>
    {% if previous_week %}
        Previous Week: {{ previous_week|date:"W" }} of year {{ previous_week|date:"Y" }}
    {% endif %}
    {% if previous_week and next_week %}--{% endif %}
    {% if next_week %}
        Next week: {{ next_week|date:"W" }} of year {{ next_week|date:"Y" }}
    {% endif %}
</p>

En este ejemplo, estás imprimiendo el número de semana. Ten en cuenta que los números de semana calculados por el filtro de plantilla date con el carácter de formato 'W' no siempre son iguales a aquellos calculados por strftime() y strptime() con la cadena de formato '%W'. Por ejemplo, para el año 2015, los números de semana impuestos por date son mayores en uno comparado con aquellos impuestos por strftime(). No hay un equivalente para la cadena de formato '%U' strftime() en date. Por lo tanto, debes evitar usar date para generar URLs para WeekArchiveView.

Vista de archivo diario

class DayArchiveView[fuente]

Página de archivo diaria que muestra todos los objetos en un día determinado. Los días del futuro lanzan una excepción 404, independientemente de si existen objetos para días futuros, a menos que establezcas allow_future en True.

Ancestros (MRO)

Contexto

Además del contexto proporcionado por MultipleObjectMixin (a través de BaseDateListView), el contexto del template será:

Notas

  • Se utiliza un sufijo de nombre de plantilla por defecto _archive_day.

Ejemplo myapp/views.py:

from django.views.generic.dates import DayArchiveView

from myapp.models import Article


class ArticleDayArchiveView(DayArchiveView):
    queryset = Article.objects.all()
    date_field = "pub_date"
    allow_future = True

Ejemplo myapp/urls.py:

from django.urls import path

from myapp.views import ArticleDayArchiveView

urlpatterns = [
    # Example: /2012/nov/10/
    path(
        "<int:year>/<str:month>/<int:day>/",
        ArticleDayArchiveView.as_view(),
        name="archive_day",
    ),
]

Ejemplo myapp/article_archive_day.html:

<h1>{{ day }}</h1>

<ul>
    {% for article in object_list %}
        <li>{{ article.pub_date|date:"F j, Y" }}: {{ article.title }}</li>
    {% endfor %}
</ul>

<p>
    {% if previous_day %}
        Previous Day: {{ previous_day }}
    {% endif %}
    {% if previous_day and next_day %}--{% endif %}
    {% if next_day %}
        Next Day: {{ next_day }}
    {% endif %}
</p>

Vista de archivo de hoy

class TodayArchiveView[fuente]

Una página de archivo diario que muestra todos los objetos para hoy. Esto es exactamente lo mismo que django.views.generic.dates.DayArchiveView, excepto que se utiliza la fecha de hoy en lugar de los argumentos year/month/day.

Ancestros (MRO)

Notas

  • Se utiliza un sufijo de nombre de plantilla por defecto de _archive_today.

Ejemplo myapp/views.py:

from django.views.generic.dates import TodayArchiveView

from myapp.models import Article


class ArticleTodayArchiveView(TodayArchiveView):
    queryset = Article.objects.all()
    date_field = "pub_date"
    allow_future = True

Ejemplo myapp/urls.py:

from django.urls import path

from myapp.views import ArticleTodayArchiveView

urlpatterns = [
    path("today/", ArticleTodayArchiveView.as_view(), name="archive_today"),
]

¿Dónde está el ejemplo de la plantilla para TodayArchiveView?

Esta vista utiliza por defecto la misma plantilla que la DayArchiveView, que se muestra en el ejemplo anterior. Si necesitas una plantilla diferente, establece el atributo template_name para ser el nombre de la nueva plantilla.

Detalles de fecha

class DateDetailView[fuente]

Una página que representa un objeto individual. Si el objeto tiene un valor de fecha en el futuro, la vista lanzará por defecto un error 404, a menos que establezcas allow_future en True.

Ancestros (MRO)

Contexto

  • Incluye el objeto único asociado con la model especificada en la DateDetailView.

Notas

  • Utiliza un sufijo de nombre de plantilla por defecto de _detail.

Ejemplo myapp/urls.py:

from django.urls import path
from django.views.generic.dates import DateDetailView

urlpatterns = [
    path(
        "<int:year>/<str:month>/<int:day>/<int:pk>/",
        DateDetailView.as_view(model=Article, date_field="pub_date"),
        name="archive_date_detail",
    ),
]

Ejemplo myapp/article_detail.html:

<h1>{{ object.title }}</h1>

Nota

Todos los vistas genéricas enumeradas anteriormente tienen vistas de base que solo difieren en que no incluyen la MultipleObjectTemplateResponseMixin (para las vistas de archivo) o la SingleObjectTemplateResponseMixin (para la DateDetailView):

class BaseArchiveIndexView[fuente]
class BaseYearArchiveView[fuente]
class BaseMonthArchiveView[fuente]
class BaseWeekArchiveView[fuente]
class BaseDayArchiveView[fuente]
class BaseTodayArchiveView[fuente]
class BaseDateDetailView[fuente]