First, register the app in your project settings like this :


Then after you should register the app urls in your project :

url(r'^tribune/', include('djangotribune.urls')),

Of course, you can use another mounting directory than the default tribune/ or even use your own app urls, look at the provided djangotribune.urls to see what you have to map.

And finally don’t forget to do the Django’s syncdb command to synchronize models in your database.

If needed, you can change some Application settings in your settings file.


The recommended database engine is PostgreSQL. With SQLite you could have problems because the application makes usage of case-insensitive matching notably in Message filtering system.

Project templates

A simple note about templates, djangotribune templates use a base template djangotribune/base.html to include some common HTML to add contents to your layout, and all other templates extend it to insert theirs.

This base template is made to extend a skeleton.html template that should be the root base of your project layout. Therefore, if you don’t use a base template or use it with another name, just override djangotribune/base.html in project templates to fit it right within your project.

Also, note that templates have been written for Foundation3 so if you don’t use it, it should not really matter to you as this is only HTML, you can style it yourself or at least change the templates to accomodate to your needed HTML structure. And if you want to use Foundation3, just add its required assets to your project, but for the url archives form you will have to patch some Javascript because of an added feature to use input checkbox inside button dropdown.

Here is a patch file for the Javascript file for buttons :

diff --git a/project/webapp_statics/js/foundation/ b/project/webapp_statics/js/foundation/
--- a/project/webapp_statics/js/foundation/
+++ b/project/webapp_statics/js/foundation/
@@ -33,6 +33,12 @@
        button = $el.closest('.button.dropdown'),
        dropdown = $('> ul', button);

+        // let ".no-reset-click" elements to act by default to prevent dropdown closing
+        if($('no-reset-click')){
+          e.stopPropagation();
+          return true;
+        }

And another patch file for your app.js :

diff --git a/project/webapp_statics/js/foundation/app.js b/project/webapp_statics/js/foundation/app.js
--- a/project/webapp_statics/js/foundation/app.js
+++ b/project/webapp_statics/js/foundation/app.js
@@ -11,6 +11,15 @@ function column_equalizer(){

$(document).ready(function() {
+    // Automatically add "no-reset-click" class on direct input parent label to
+    // follow their natural behavior (to propagate the click to their input child,
+    // usually only for radio or checkbox)
+    $("form .button.dropdown .no-reset-click").each(function(index) {
+        if($(this).parent().prop('nodeName')=='LABEL'){
+            $(this).parent().addClass('no-reset-click');
+        }
+    });
    //$.fn.foundationAlerts           ? $doc.foundationAlerts() : null;
    $.fn.foundationButtons          ? $doc.foundationButtons() : null;
    //$.fn.foundationAccordion        ? $doc.foundationAccordion() : null;


Since 0.6.6 version, South support is implemented, so for future updates you will have to use something like :

./ migrate djangotribune

And model changes will be automatically applied to your database.

Application settings

All default app settings are located in the file of djangotribune, you can modify them in your project settings.


All app settings are overwritten if present in your project settings with the exception of dict variables. This is to be remembered when you want to add a new entry in a list variable, you will have to copy the default version in your settings with the new entry otherwise default variable will be lost.


When set to True all anonymous users will be rejected from any request on remote views, post views and board views, only registred users will continue to access to these views.

By default this is set to False so anonymous and registred users have full access to any public views.


Default message limit to display in backend.

Requires an integer, by default this is set to 50.


The maximum value allowed for the message limit option. Limit option used beyond this will be set to this maximum value.

Requires an integer, by default this is set to 100.


Maximum length (in characters) for the content message.

Requires an integer, by default this is set to 500. You have no real limit on this value because this is stored in full text field without limit.


Template string for smileys URL, this is where you can set the wanted smiley host. By default this is set to :{0}.gif

So the host will be that is the safe for work version, if you prefer the non safe for work use instead.


List of titles randomly displayed on tribune boards.

The default one allready contains many titles.

The URL to use to request the LastFM API used within lastfm action command.
The Application key to use for on requests made to LastFM API.
The default time in milli-seconds between each backend refresh request on the interface.
A boolean to define (if True) if URLs should be displayed as a truncated url of 100 characters maximum. Default behavior (when False or not in your settings) is to display them like [url] if it does not match any regex in the dictionnary parser.URL_SUBSTITUTION.

Internationalization and localization

This application make usage of the Django internationalization system, see the Django documentation about this if you want to add a new language translation.