123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- .. _routable_page_mixin:
- =====================
- ``RoutablePageMixin``
- =====================
- .. module:: wagtail.contrib.wagtailroutablepage
- The ``RoutablePageMixin`` mixin provides a convenient way for a page to respond on multiple sub-URLs with different views. For example, a blog section on a site might provide several different types of index page at URLs like ``/blog/2013/06/``, ``/blog/authors/bob/``, ``/blog/tagged/python/``, all served by the same page instance.
- A ``Page`` using ``RoutablePageMixin`` exists within the page tree like any other page, but URL paths underneath it are checked against a list of patterns. If none of the patterns match, control is passed to subpages as usual (or failing that, a 404 error is thrown).
- Installation
- ============
- Add ``"wagtail.contrib.wagtailroutablepage"`` to your INSTALLED_APPS:
- .. code-block:: python
- INSTALLED_APPS = [
- ...
- "wagtail.contrib.wagtailroutablepage",
- ]
- The basics
- ==========
- To use ``RoutablePageMixin``, you need to make your class inherit from both :class:`wagtail.contrib.wagtailroutablepage.models.RoutablePageMixin` and :class:`wagtail.wagtailcore.models.Page`, then define some view methods and decorate them with ``wagtail.contrib.wagtailroutablepage.models.route``.
- Here's an example of an ``EventPage`` with three views:
- .. code-block:: python
- from wagtail.wagtailcore.models import Page
- from wagtail.contrib.wagtailroutablepage.models import RoutablePageMixin, route
- class EventPage(RoutablePageMixin, Page):
- ...
- @route(r'^$')
- def current_events(self, request):
- """
- View function for the current events page
- """
- ...
- @route(r'^past/$')
- def past_events(self, request):
- """
- View function for the past events page
- """
- ...
- # Multiple routes!
- @route(r'^year/(\d+)/$')
- @route(r'^year/current/$')
- def events_for_year(self, request, year=None):
- """
- View function for the events for year page
- """
- ...
- Reversing URLs
- ==============
- :class:`~models.RoutablePageMixin` adds a :meth:`~models.RoutablePageMixin.reverse_subpage` method to your page model which you can use for reversing URLs. For example:
- .. code-block:: python
- # The URL name defaults to the view method name.
- >>> event_page.reverse_subpage('events_for_year', args=(2015, ))
- 'year/2015/'
- This method only returns the part of the URL within the page. To get the full URL, you must append it to the values of either the :attr:`~wagtail.wagtailcore.models.Page.url` or the :attr:`~wagtail.wagtailcore.models.Page.full_url` attribute on your page:
- .. code-block:: python
- >>> event_page.url + event_page.reverse_subpage('events_for_year', args=(2015, ))
- '/events/year/2015/'
- >>> event_page.full_url + event_page.reverse_subpage('events_for_year', args=(2015, ))
- 'http://example.com/events/year/2015/'
- Changing route names
- --------------------
- The route name defaults to the name of the view. You can override this name with the ``name`` keyword argument on ``@route``:
- .. code-block:: python
- from wagtail.wagtailcore.models import Page
- from wagtail.contrib.wagtailroutablepage.models import RoutablePageMixin, route
- class EventPage(RoutablePageMixin, Page):
- ...
- @route(r'^year/(\d+)/$', name='year')
- def events_for_year(self, request, year):
- """
- View function for the events for year page
- """
- ...
- .. code-block:: python
- >>> event_page.reverse_subpage('year', args=(2015, ))
- '/events/year/2015/'
- The ``RoutablePageMixin`` class
- ===============================
- .. automodule:: wagtail.contrib.wagtailroutablepage.models
- .. autoclass:: RoutablePageMixin
- .. automethod:: get_subpage_urls
- .. automethod:: resolve_subpage
- Example:
- .. code-block:: python
- view, args, kwargs = page.resolve_subpage('/past/')
- response = view(request, *args, **kwargs)
- .. automethod:: reverse_subpage
- Example:
- .. code-block:: python
- url = page.url + page.reverse_subpage('events_for_year', kwargs={'year': '2014'})
- .. _routablepageurl_template_tag:
- The ``routablepageurl`` template tag
- ====================================
- .. currentmodule:: wagtail.contrib.wagtailroutablepage.templatetags.wagtailroutablepage_tags
- .. autofunction:: routablepageurl
- Example:
- .. code-block:: html+django
- {% load wagtailroutablepage_tags %}
- {% routablepageurl page "feed" %}
- {% routablepageurl page "archive" 2014 08 14 %}
- {% routablepageurl page "food" foo="bar" baz="quux" %}
|