Using Shipherd in the Admin

The navigation mechanism is fairly complex; unfortunately, there’s no real way around that - without a lot of equally complex code that you are quite welcome to write and contribute! ;-)

For this guide, we’ll assume that you have the setup described in Getting started with philo. We’ll be adding a main Navigation to the root Node and making it display as part of the Template.

Before getting started, make sure that you’ve added philo.contrib.shipherd to your INSTALLED_APPS. shipherd template tags also require the request context processor, so make sure to set TEMPLATE_CONTEXT_PROCESSORS appropriately:

TEMPLATE_CONTEXT_PROCESSORS = (
        # Defaults
        "django.contrib.auth.context_processors.auth",
        "django.core.context_processors.debug",
        "django.core.context_processors.i18n",
        "django.core.context_processors.media",
        "django.core.context_processors.static",
        "django.contrib.messages.context_processors.messages"
        ...
        "django.core.context_processors.request"
)

Creating the Navigation

Start off by adding a new Navigation instance with node set to the good ole’ root node and key set to main. The default depth of 3 is fine.

Now open up that first inline NavigationItem. Make the text Hello World and set the target Node to, again, root. (Of course, this is a special case. If we had another node that we wanted to point to, we would choose that.)

Press save and you’ve created your first navigation.

Displaying the Navigation

All you need to do now is show the navigation in the template! This is quite easy, using the recursenavigation templatetag. For now we’ll keep it simple. Adjust the “Hello World Template” to look like this:

<html>{% load shipherd %}
    <head>
        <title>{% container page_title %}</title>
    </head>
    <body>
        <ul>
            {% recursenavigation node "main" %}
                <li{% if navloop.active %} class="active"{% endif %}>
                    <a href="{{ item.get_target_url }}">{{ item.text }}</a>
                </li>
            {% endrecursenavigation %}
        </ul>
        {% container page_body as content %}
        {% if content %}
            <p>{{ content }}</p>
        {% endif %}
        <p>The time is {% now %}.</p>
    </body>
</html>

Now have a look at the page - your navigation is there!

Linking to google

Edit the main Navigation again to add another NavigationItem. This time give it the text Google and set the url_or_subpath field to http://google.com. A navigation item will show up on the Hello World page that points to google.com! Granted, your navigation probably shouldn’t do that, because confusing navigation is confusing; the point is that it is possible to provide navigation to arbitrary URLs.

url_or_subpath can also be used in conjuction with a Node to link to a subpath beyond that Node‘s url.

Project Versions

Table Of Contents

Previous topic

Getting started with philo

Next topic

Philo’s models

This Page