You can completely control the look and feel of your Pinax-based site via the templates, so if you don’t like the way the tabs are done, you can always do it a completely different way.
But this is how tab navigation is done in the sample projects.
Here is how to add a new tab for your app myapp:
- In site_base.html add a new td in the tabs or right_tab block. Make sure that td is in a class specific to that tab, e.g. rtab_myapp
- Create a myapps/base.html template that all pages under that tab will extend. Make sure it defines a block tab_id or rtab_id (depending on whether it’s a left or right tab) with content id="myapp_tab"
- edit the CSS file (base.css or tabs.css if it exists) and at the appropriate points add the selectors:
- #myapp_tab .rtab_myapp
- #myapp_tab .rtab_myapp a
- #myapp_tab .rtab_myapp div
base.html has the following:
<div id="tabhead">
<div class="tabs" {% block tab_id %}{% endblock %}>{% block tabs %}{% endblock %}</div>
<div class="right_tab" {% block rtab_id %}{% endblock %}>{% block right_tab %}{% endblock %}</div>
</div>
<div id="subnav" class="clearfix">{% block subnav %} {% endblock %}</div>
Note that this defines five blocks:
- tab_id
- tabs
- rtab_id
- right_tab
- subnav
You shouldn’t normally need to change this at all for your site unless you want to make a change like move where the subnav goes.
site_base.html then override the tabs and right_tab blocks with the actual site-wide tabs. For example, here is a right_tab with three tabs defined that only show when the user is logged in:
{% block right_tab %}
{% if user.is_authenticated %}
<table>
<tr>
<td class="tab rtab_profile"><div><a href="{% url profiles.views.profile user %}">Profile</a></div></td>
<td class="tab rtab_blogs"><div><a href="{% url blog.views.blogs %}">Blogs</a></div></td>
<td class="tab rtab_bookmarks"><div><a href="{% url bookmarks.views.bookmarks %}">Bookmarks</a></div></td>
</tr>
</table>
{% endif %}
{% endblock %}
Note that each td is put in the class tab as well as a class specific to the tab, e.g. rtab_bookmarks for the bookmarks tab.
Now, any page under the bookmarks tab extends the template bookmarks/base.html which looks something like this:
{% extends "site_base.html" %}
{% block rtab_id %}id="bookmarks_tab"{% endblock %}
{% block subnav %}
<ul>
<li><a href="{% url add_bookmark %}">Add Bookmark</a></li>
<li><a href="{% url your_bookmarks %}">Your Bookmarks</a></li>
<li><a href="{% url all_bookmarks %}">All Bookmarks</a></li>
</ul>
{% endblock %}
Notice that this bookmarks-specific base template defines the subnav block which provides the subnav for all bookmarks pages.
It also defines the rtab_id block we saw used by the site-wide base.html. This adds id="bookmarks_tab" to the div in the site-wide base.html template responsible for the right tab. A left tab would define tab_id similarly instead.
Now all that remains is the CSS that ties the div in base.html with id="bookmarks_tab” to the td in site_base.html that has is in class rtab_bookmarks.
This is done in CSS. It could be done in base.css like complete_project does it or in a separate tabs.css like in basic_project (as long as the relevant pages all load that CSS)
#profile_tab .rtab_profile,
#blogs_tab .rtab_blogs,
#bookmarks_tab .rtab_bookmarks
{
bottom: -1px !important;
padding-bottom: 0 !important;
}
#profile_tab .rtab_profile a,
#blogs_tab .rtab_blogs a,
#bookmarks_tab .rtab_bookmarks a
{
color: #000 !important; /* selected tab text colour */
}
#profile_tab .rtab_profile div,
#blogs_tab .rtab_blogs div,
#bookmarks_tab .rtab_bookmarks div
{
margin: 0;
background-color: #DEF !important; /* selected tab colour */
border-left: 1px solid #000 !important; /* tab border */
border-top: 1px solid #000 !important; /* tab border */
border-right: 1px solid #000 !important; /* tab border */
padding-bottom: 5px; /* 1px more than unselected padding-bottom */
}
Notice that the selector #bookmarks_tab .rtab_bookmarks appears three times, once by itself, once with an a and once with a div.