PageRenderTime 46ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/servicios_web/gae/django-guestbook/src/django/views/generic/list_detail.py

https://github.com/enlaces/curso_python_dga_11
Python | 152 lines | 102 code | 5 blank | 45 comment | 29 complexity | 9ab5ead48b974d1c552599f5d7598b6a MD5 | raw file
  1. from django.template import loader, RequestContext
  2. from django.http import Http404, HttpResponse
  3. from django.core.xheaders import populate_xheaders
  4. from django.core.paginator import Paginator, InvalidPage
  5. from django.core.exceptions import ObjectDoesNotExist
  6. import warnings
  7. warnings.warn(
  8. 'Function-based generic views have been deprecated; use class-based views instead.',
  9. PendingDeprecationWarning
  10. )
  11. def object_list(request, queryset, paginate_by=None, page=None,
  12. allow_empty=True, template_name=None, template_loader=loader,
  13. extra_context=None, context_processors=None, template_object_name='object',
  14. mimetype=None):
  15. """
  16. Generic list of objects.
  17. Templates: ``<app_label>/<model_name>_list.html``
  18. Context:
  19. object_list
  20. list of objects
  21. is_paginated
  22. are the results paginated?
  23. results_per_page
  24. number of objects per page (if paginated)
  25. has_next
  26. is there a next page?
  27. has_previous
  28. is there a prev page?
  29. page
  30. the current page
  31. next
  32. the next page
  33. previous
  34. the previous page
  35. pages
  36. number of pages, total
  37. hits
  38. number of objects, total
  39. last_on_page
  40. the result number of the last of object in the
  41. object_list (1-indexed)
  42. first_on_page
  43. the result number of the first object in the
  44. object_list (1-indexed)
  45. page_range:
  46. A list of the page numbers (1-indexed).
  47. """
  48. if extra_context is None: extra_context = {}
  49. queryset = queryset._clone()
  50. if paginate_by:
  51. paginator = Paginator(queryset, paginate_by, allow_empty_first_page=allow_empty)
  52. if not page:
  53. page = request.GET.get('page', 1)
  54. try:
  55. page_number = int(page)
  56. except ValueError:
  57. if page == 'last':
  58. page_number = paginator.num_pages
  59. else:
  60. # Page is not 'last', nor can it be converted to an int.
  61. raise Http404
  62. try:
  63. page_obj = paginator.page(page_number)
  64. except InvalidPage:
  65. raise Http404
  66. c = RequestContext(request, {
  67. '%s_list' % template_object_name: page_obj.object_list,
  68. 'paginator': paginator,
  69. 'page_obj': page_obj,
  70. # Legacy template context stuff. New templates should use page_obj
  71. # to access this instead.
  72. 'is_paginated': page_obj.has_other_pages(),
  73. 'results_per_page': paginator.per_page,
  74. 'has_next': page_obj.has_next(),
  75. 'has_previous': page_obj.has_previous(),
  76. 'page': page_obj.number,
  77. 'next': page_obj.next_page_number(),
  78. 'previous': page_obj.previous_page_number(),
  79. 'first_on_page': page_obj.start_index(),
  80. 'last_on_page': page_obj.end_index(),
  81. 'pages': paginator.num_pages,
  82. 'hits': paginator.count,
  83. 'page_range': paginator.page_range,
  84. }, context_processors)
  85. else:
  86. c = RequestContext(request, {
  87. '%s_list' % template_object_name: queryset,
  88. 'paginator': None,
  89. 'page_obj': None,
  90. 'is_paginated': False,
  91. }, context_processors)
  92. if not allow_empty and len(queryset) == 0:
  93. raise Http404
  94. for key, value in extra_context.items():
  95. if callable(value):
  96. c[key] = value()
  97. else:
  98. c[key] = value
  99. if not template_name:
  100. model = queryset.model
  101. template_name = "%s/%s_list.html" % (model._meta.app_label, model._meta.object_name.lower())
  102. t = template_loader.get_template(template_name)
  103. return HttpResponse(t.render(c), mimetype=mimetype)
  104. def object_detail(request, queryset, object_id=None, slug=None,
  105. slug_field='slug', template_name=None, template_name_field=None,
  106. template_loader=loader, extra_context=None,
  107. context_processors=None, template_object_name='object',
  108. mimetype=None):
  109. """
  110. Generic detail of an object.
  111. Templates: ``<app_label>/<model_name>_detail.html``
  112. Context:
  113. object
  114. the object
  115. """
  116. if extra_context is None: extra_context = {}
  117. model = queryset.model
  118. if object_id:
  119. queryset = queryset.filter(pk=object_id)
  120. elif slug and slug_field:
  121. queryset = queryset.filter(**{slug_field: slug})
  122. else:
  123. raise AttributeError("Generic detail view must be called with either an object_id or a slug/slug_field.")
  124. try:
  125. obj = queryset.get()
  126. except ObjectDoesNotExist:
  127. raise Http404("No %s found matching the query" % (model._meta.verbose_name))
  128. if not template_name:
  129. template_name = "%s/%s_detail.html" % (model._meta.app_label, model._meta.object_name.lower())
  130. if template_name_field:
  131. template_name_list = [getattr(obj, template_name_field), template_name]
  132. t = template_loader.select_template(template_name_list)
  133. else:
  134. t = template_loader.get_template(template_name)
  135. c = RequestContext(request, {
  136. template_object_name: obj,
  137. }, context_processors)
  138. for key, value in extra_context.items():
  139. if callable(value):
  140. c[key] = value()
  141. else:
  142. c[key] = value
  143. response = HttpResponse(t.render(c), mimetype=mimetype)
  144. populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.name))
  145. return response