Джанго Пагинат по годам - PullRequest
       6

Джанго Пагинат по годам

3 голосов
/ 24 декабря 2011

Мне удалось просмотреть 100 самых последних элементов в моей базе данных обрезки новостей на главной странице моего веб-сайта с общим представлением:

DPRM

Теперь мне нужноразбить мою базу данных на отдельные логические разделы моего сайта.Мне нужно разбить на страницы по годам.Мне все равно, сколько записей в каждом году, я просто хочу взять год из URL, извлечь элементы базы данных этого года (например, / newsitems / validyearhere) и представить его пользователю с возможностью навигациичерез годы.Есть способ сделать это в Rails, но я не смог найти способ в Django.

Смогу ли я использовать развернутую модель?

from django.db import models

class Article(models.Model):
    headline = models.CharField(max_length=100)
    subhead = models.CharField(max_length=50)
    publication = models.CharField(max_length=30)
    author = models.CharField(max_length=50)
    date = models.DateField()
    website = models.URLField()

    def __unicode__(self):
        return self.headline

Придется ли мнедобавить избыточное поле базы данных Year, в дополнение к полю текущей даты?Должна ли схема каким-либо образом развиваться, чтобы приспособиться к этому?

Мне также нужно, чтобы она изящно провалилась, если пользователь вводит год без записей или данных, отличных от года.

Пожалуйста, объясните это настолько просто, насколько вы можете, так как я очень новичок в Django и считаю, что кривая обучения крутая.

Ответы [ 2 ]

7 голосов
/ 24 декабря 2011

С новыми представлениями на основе классов проще всего было бы использовать YearArchiveView

class ArticleYearArchiveView(YearArchiveView):
    model = Article
    paginate_by = 100
    context_object_name = 'article_list'
    date_field = 'date'
    allow_empty = True

Разрешить пустое отображение страницы, даже если нет элементовна этот год

в вашем urls.py вам понадобится что-то вроде

url(r'^newsitems/(?P<year>\d+)/$', ArticleYearArchiveView.as_view()),
1 голос
/ 24 декабря 2011

Да, с вашей моделью все в порядке. Почему бы не написать представление на основе классов?

class SomeListView(ListView):
    model = Article
    paginate_by = 100
    template_name = "app/template.html"
    context_object_name = "articles" # or use object_list

    def get_queryset(self):
        return Article.objects.order_by('-date')

Вы можете добавить другой фильтр в get_queryset для создания списка с результатами по годам, а в своем шаблоне вы можете перебирать их и создавать пользовательские кнопки (с информацией о году)

...