Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

views.py 1.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from __future__ import unicode_literals
  2. from django.contrib.contenttypes.models import ContentType
  3. from django.shortcuts import get_object_or_404
  4. from django.views.generic.list import ListView
  5. from taggit.models import Tag, TaggedItem
  6. def tagged_object_list(request, slug, queryset, **kwargs):
  7. if callable(queryset):
  8. queryset = queryset()
  9. queryset_model = ContentType.objects.get_for_model(queryset.model)
  10. kwargs["slug"] = slug
  11. tag_list_view = type(
  12. str('TagListView'),
  13. (TagListMixin, ListView),
  14. {
  15. 'model': queryset_model,
  16. 'queryset': queryset
  17. }
  18. )
  19. return tag_list_view.as_view()(request, **kwargs)
  20. class TagListMixin(object):
  21. tag_suffix = '_tag'
  22. def dispatch(self, request, *args, **kwargs):
  23. slug = kwargs.pop('slug')
  24. self.tag = get_object_or_404(Tag, slug=slug)
  25. return super(TagListMixin, self).dispatch(request, *args, **kwargs)
  26. def get_queryset(self, **kwargs):
  27. qs = super(TagListMixin, self).get_queryset(**kwargs)
  28. return qs.filter(
  29. pk__in=TaggedItem.objects.filter(
  30. tag=self.tag, content_type=ContentType.objects.get_for_model(qs.model)
  31. ).values_list("object_id", flat=True))
  32. def get_template_names(self):
  33. if self.tag_suffix:
  34. self.template_name_suffix = self.tag_suffix + self.template_name_suffix
  35. return super(TagListMixin, self).get_template_names()
  36. def get_context_data(self, **kwargs):
  37. context = super(TagListMixin, self).get_context_data(**kwargs)
  38. if "extra_context" not in context:
  39. context["extra_context"] = {}
  40. context["extra_context"]["tag"] = self.tag
  41. return context