models.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  2. from django.db import models
  3. from wagtail.wagtailadmin.edit_handlers import FieldPanel, StreamFieldPanel
  4. from wagtail.wagtailcore.fields import StreamField
  5. from wagtail.wagtailcore.models import Page
  6. from wagtail.wagtailcore import blocks
  7. from wagtail.wagtailimages.edit_handlers import ImageChooserPanel
  8. from wagtail.wagtailsearch import index
  9. from wagtail.wagtailsnippets.models import register_snippet
  10. from bakerydemo.base.models import CommonPageFieldsMixin
  11. @register_snippet
  12. class Country(models.Model):
  13. """
  14. Standard Django model to store set of countries of origin.
  15. Exposed in the Wagtail admin via Snippets.
  16. """
  17. title = models.CharField(max_length=100)
  18. def __str__(self):
  19. return self.title
  20. class Meta:
  21. verbose_name_plural = "Countries of Origin"
  22. @register_snippet
  23. class BreadType(models.Model):
  24. """
  25. Standard Django model used as a Snippet in the BreadPage model.
  26. """
  27. title = models.CharField(max_length=255)
  28. panels = [
  29. FieldPanel('title'),
  30. ]
  31. def __str__(self):
  32. return self.title
  33. class Meta:
  34. verbose_name_plural = "Bread types"
  35. class BreadPage(Page):
  36. """
  37. Detail view for a specific bread
  38. """
  39. origin = models.ForeignKey(
  40. Country,
  41. on_delete=models.SET_NULL,
  42. null=True,
  43. blank=True,
  44. )
  45. description = StreamField([
  46. ('heading', blocks.CharBlock(classname="full title")),
  47. ('paragraph', blocks.RichTextBlock()),
  48. ])
  49. bread_type = models.ForeignKey(
  50. 'breads.BreadType',
  51. null=True,
  52. blank=True,
  53. on_delete=models.SET_NULL,
  54. related_name='+'
  55. )
  56. image = models.ForeignKey(
  57. 'wagtailimages.Image',
  58. on_delete=models.SET_NULL,
  59. null=True,
  60. blank=True,
  61. related_name='+',
  62. help_text='Landscape mode only; horizontal width between 1000px and 3000px.'
  63. )
  64. content_panels = [
  65. FieldPanel('title'),
  66. FieldPanel('origin'),
  67. FieldPanel('bread_type'),
  68. ImageChooserPanel('image'),
  69. StreamFieldPanel('description'),
  70. ]
  71. search_fields = Page.search_fields + [
  72. index.SearchField('title'),
  73. index.SearchField('description'),
  74. ]
  75. parent_page_types = ['BreadsIndexPage']
  76. api_fields = ['title', 'bread_type', 'origin', 'image']
  77. class BreadsIndexPage(CommonPageFieldsMixin, Page):
  78. """
  79. Index page for breads. We don't have any fields within our model but we need
  80. to alter the page model's context to return the child page objects - the
  81. BreadPage - so that it works as an index page
  82. """
  83. subpage_types = ['BreadPage']
  84. def get_context(self, request):
  85. context = super(BreadsIndexPage, self).get_context(request)
  86. # Get the full unpaginated listing of resource pages as a queryset -
  87. # replace this with your own query as appropriate
  88. all_resources = self.get_children().live()
  89. paginator = Paginator(all_resources, 5) # Show 5 resources per page
  90. page = request.GET.get('page')
  91. try:
  92. resources = paginator.page(page)
  93. except PageNotAnInteger:
  94. # If page is not an integer, deliver first page.
  95. resources = paginator.page(1)
  96. except EmptyPage:
  97. # If page is out of range (e.g. 9999), deliver last page of results.
  98. resources = paginator.page(paginator.num_pages)
  99. # make the variable 'resources' available on the template
  100. context['resources'] = resources
  101. context['paginator'] = paginator
  102. return context