“Views” de datas genéricas

“Views” genéricas baseadas em datas, fornecidas no django.views.generic.dates, são “views” para mostrar páginas de resumo de dados baseados em datas.

Nota

Alguns dos exmplos nesta página assumem que um modelo de Article foi definido com a seguir em 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})

ArchiveIndexView

class ArchiveIndexView

Uma página de índice de n;ível superior que mostra os últimos (“latest”) objetos, por data. Objetos com uma data no futuro não estão incluídos a menos que seja definido allow_future como True.

Ancestrais (MRO)

Context

Além do contexto fornecido pelo django.views.generic.list.MultipleObjectMixin (através da django.views.generic.dates.BaseDateListView), o contexto do template será:

  • date_list: Um objeto QuerySet contendo todos os anos que tenham objetos disponíveis de acordo com o queryset, representado como objetos datetime.datetime, em ordem ascendente.

Notas

  • Usa um context_object_name padrão como latest.
  • Usa um template_name_suffix padrão como _archive.
  • Por padrão fornece date_list por ano, mas isso pode ser alterado para mês ou dia usando o atributo date_list_period. Isso se aplica a todas as subclasses de “views”.

Exemplo 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",
    ),
]

Exemplo myapp/article_archive.html:

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

Isso irá retornar todos os artigos.

YearArchiveView

class YearArchiveView

Uma página de arquivos anuais mostrando todos os meses disponíveis em um dado ano. Objetos com uma data no futuro não são mostrados a menos que defina allow_future como True.

Ancestrais (MRO)

make_object_list

Um booleano que especifica se retorna ou não a lista toda de objetos para este ano e os passa para o template. Se True, a lista de objetos será disponibilizada no contexto. Se False, o “queryset” None será usado como a lista de objetos. Por padrão isso é False.

get_make_object_list()

Determina se uma lista de objetos será retonado como parte do contexto. Retorna make_object_list por padrão.

Context

Além do contexto fornecido pelo django.views.generic.list.MultipleObjectMixin (através da django.views.generic.dates.BaseDateListView), o contexto do template será:

  • date_list: Um objeto QuerySet contendo todos os meses que tenham objetos disponíveis de acordo com o queryset, representado como objetos datetime.datetime em order ascendente.
  • year: Um objeto date representando um dado ano.
  • next_year: Um objeto do tipo date representando o primeiro dia do próximo ano, de acordo com allow_empty e allow_future.
  • previous_year: Um objeto date representando o primeiro dia do ano anterior, de acordo com allow_empty e allow_future.

Notas

  • Usa um template_name_suffix padrão como _archive_year.

Exemplo 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

Exemplo myapp/urls.py:

from django.urls import path

from myapp.views import ArticleYearArchiveView

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

Exemplo 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>

MonthArchiveView

class MonthArchiveView

Uma página de arquivo mensal mostrando todos os objetos em um dado mês. Objetos com uma data no futuro não são mostrados a menos que defina allow_future como True.

Ancestrais (MRO)

Context

Além do contexto fornecido pela MultipleObjectMixin (via BaseDateListView), o contexto do template será:

  • date_list: Um objeto do tipo QuerySet contendo todo os dias que tenham objetos disponíveis no dado mês, de cordo com o queryset, representando como objetos do tipo datetime.datetime , em orderm ascendente.
  • month: Um objeto do tipo date representando o dado mês.
  • next_month: Um objeto date que representa o primeiro dia do próximo mês, de acordo com allow_empty e allow_future.
  • previous_month: Um objeto date que representa o primeiro dia do mês anterior, de acordo com allow_empty e allow_future.

Notas

  • Usa um template_name_suffix padrão como _archive_month.

Exemplo 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

Exemplo 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",
    ),
]

Exemplo 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>

WeekArchiveView

class WeekArchiveView

Uma página de arquivo semanal mostrando todos os objetos em determinada semana. Objetos com uma data no futuro não são exibidos a menos que você defina allow_future como True.

Ancestrais (MRO)

Context

Além do contexto fornecido pela MultipleObjectMixin (via BaseDateListView), o contexto do template será:

  • week: Um objeto date que representa o primeiro dia de uma dada semana.
  • next_week: Um objeto do tipo date representando o primeiro dia da próxima semana, de acordo com allow_empty e allow_future.
  • previous_week: Um objeto date representando o primeiro dia da semana anterior, de acordo com allow_empty e allow_future.

Notas

  • Usa um template_name_suffix padrão como _archive_week.
  • O atributo week_format é uma string de formtação do tipo strptime() usada para formatar o número da semana. Os seguintes valores são permitidos:
    • '%U': Baseado no sistema de semanas do Estados Unidos onde a semana começa no Domingo. Este é o valor padrão.
    • '%W': Similar to '%U', except it assumes that the week begins on Monday. This is not the same as the ISO 8601 week number.
    • '%V': ISO 8601 week number where the week begins on Monday.

Exemplo 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

Exemplo 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",
    ),
]

Exemplo 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>

Nesse exemplo, você está exibindo o número da semana. Note que os números da semana computados pelo filtro de template date com o caractere 'W' não é extamente o mesmo que os computados pelo strftime() e strptime() com a string de formatação '%W'. No ano de 2015, por exemplo, a exibição dos números da semana pelo date são maiores que outras se comparadas com a saída pelo strftime(). Não há um equivalente para a string de formatação '%U' strftime(). Por tanto, você deve evitar o uso de date para gerar URLs para WeekArchiveView.

DayArchiveView

class DayArchiveView

Uma página de arquivo diária mostrando todos os objetos em determinado dia. Dias no futuro retornam erro 404, independente da existência de objetos com dias futuros, a menos que você defina allow_future como True.

Ancestrais (MRO)

Context

Além do contexto fornecido pela MultipleObjectMixin (via BaseDateListView), o contexto do template será:

Notas

  • Usa um template_name_suffix padrão como _archive_day.

Exemplo 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

Exemplo 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",
    ),
]

Exemplo 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>

TodayArchiveView

class TodayArchiveView

Uma página de arquivo diária mostrando todos os objetos de “hoje”. Isso é exatamente o mesmo que django.views.generic.dates.DayArchiveView, exceto que a data de “hoje” é usada ao invés dos argumentos year/month/day

Ancestrais (MRO)

Notas

  • Usa um template_name_suffix padrão como _archive_today.

Exemplo 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

Exemplo myapp/urls.py:

from django.urls import path

from myapp.views import ArticleTodayArchiveView

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

Onde está o template de exemplo do TodayArchiveView?

Essa view usa por padrão o mesmo template do DayArchiveView do exemplo anterior. Se você precisa de um template diferente, defina o nome do novo template no atributo template_name.

DateDetailView

class DateDetailView

Uma página representando um objeto individual. Se o objeto possui uma data no futuro, a view irá gerar um erro 404 por padrão, a menos que você defina allow_future como True.

Ancestrais (MRO)

Context

  • Inclui um único objeto associado ao model especificado em DateDetailView.

Notas

  • Usa um template_name_suffix padrão como _detail.

Exemplo 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",
    ),
]

Exemplo myapp/article_detail.html:

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

Nota

Todas as “views” genéricas listadas acima casam com as views Base com a diferença que elas não incluem o MultipleObjectTemplateResponseMixin (para views de arquivo) ou SingleObjectTemplateResponseMixin (para a DateDetailView):

class BaseArchiveIndexView
class BaseYearArchiveView
class BaseMonthArchiveView
class BaseWeekArchiveView
class BaseDayArchiveView
class BaseTodayArchiveView
class BaseDateDetailView
Back to Top