перечисление объекта с определенным тегом с использованием django_taggit - PullRequest
3 голосов
/ 18 декабря 2011

У меня есть приложение для блога, которое использует django_taggit . Мои HomePageView подклассы ArchiveIndexView и работают хорошо.

Теперь мне бы хотелось, чтобы работала следующая ссылка: http://mysite.com/tag/yellow, и я хотел бы использовать универсальный класс ArchiveIndexView и передать измененный набор запросов, который фильтрует тег tag_slug. Я хочу сделать это, потому что я хочу использовать тот же шаблон, что и домашняя страница.

Мой urls.py является

url(r'^$', HomePageView.as_view(paginate_by=5, date_field='pub_date',template_name='homepage.html'),
    ),

url(r'^tag/(?P<tag_slug>[-\w]+)/$', 'tag_view'), # I know this is wrong

Мой views.py является

class HomePageView(ArchiveIndexView):
"""Extends the detail view to add Events to the context"""
model = Entry

def get_context_data(self, **kwargs):
    context = super(HomePageView, self).get_context_data(**kwargs)
    context['events'] = Event.objects.filter(end_time__gte=datetime.datetime.now()
                                             ).order_by('start_time')[:5]
    context['comments'] = Comment.objects.filter(allow=True).order_by('created').reverse()[:4]
    return context

Я понимаю, что я здесь потерян, и мне нужна помощь в выяснении, как создать новый класс TagViewPage(), который изменяет набор запросов путем фильтрации по tag_slug.

1 Ответ

4 голосов
/ 18 декабря 2011

Ключевым моментом является переопределение метода get_queryset, чтобы в набор запросов входили только записи с выбранным тегом. Я сделал TagListView наследованным от HomePageView, чтобы он включал те же данные контекста - если это не важно, вы можете вместо этого создать подкласс ArchiveIndexView.

class TagListView(HomePageView):
    """
    Archive view for a given tag
    """

    # It probably makes more sense to set date_field here than in the url config
    # Ideally, set it in the parent HomePageView class instead of here.
    date_field = 'pub_date'

    def get_queryset(self):
        """
        Only include entries tagged with the selected tag
        """
        return Entry.objects.filter(tags__name=self.kwargs['tag_slug'])

    def get_context_data(self, **kwargs):
        """
        Include the tag in the context
        """
        context_data = super(TagListView, self).get_context_data(self, **kwargs)
        context_data['tag'] = get_object_or_404(Tag, slug=self.kwargs['tag_slug'])
        return context_data

# urls.py
url(r'^tag/(?P<tag_slug>[-\w]+)/$', TagListView.as_view(paginate_by=5, template_name='homepage.html')),
...