A reusable Django app for managing news/blog entries in different languages.

pip install django-multilingual-news==2.6.9


Django Multilingual News

A reusable Django app for managing news/blog entries in different languages.

Comes with a django-cms apphook and has been prepared using Django 1.5.1 and django-cms 2.4.1. From version 2.0 onwards it is tested and developed further on Django 1.9 and django-cms 3.

This app is based on the great and re-used some of it's snippets.

Current features include

  • Entry authors based on a django-people Person
  • Entry attachments based on the django-document-library Document
  • Tagging via django-multilingual-tags with a tag based archive view
  • Entry categories
  • RSS Feeds for all news entries, just special authors or tag based.
  • Site maps
  • SEO fields on the Entry for storing custom individual meta descriptions and titles.


If you want to install the latest stable release from PyPi:

$ pip install django-multilingual-news

If you feel adventurous and want to install the latest commit from GitHub:

$ pip install -e git://

Add multilingual_news to your INSTALLED_APPS:


    # cms related requirements (please check the relevant `documentation <>`)

    # filer related requirements (please check the relevant `documentation <>`)

Run the migrations:

./ migrate


Placeholders ("excerpt" and "content")

To add content to a news entry, you can make use of two cms placeholders. The excerpt is used in list views only. Adding content to a placeholder works pretty much the same like adding content to a cms page. First, create a news entry, then go to its detail view. Use the django cms toolbar to add plugins to the placeholders. For more information visit Django CMS' documentation.

Using the apphook

Simply create a django-cms page and select Multilingual News Apphook in the Application field of the Advanced Settings.


To add a sitemap of your blog, add the following to your urlconf:

from multilingual_news.sitemaps import NewsSitemap

urlpatterns += patterns(
    url(r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {
        'sitemaps': {
            'blogentries': NewsSitemap,
        }, }),

RSS Feeds

The app provides three different types of feeds, you can link to.

  1. All news {% url "news_rss" %}
  2. News from a specific author {% url "news_rss_author" %}, where author is an instance of a people.Person
  3. All news {% url "news_rss_tagged" tag=tag.slug %}, where Tag is an instance of a multilingual_tags.Tag.


You can simply add tags for a news entry from the NewsEntry admin page, which renders an inline form at the bottom.

Template tags


To render recent news:

{% load multilingual_news_tags %}
{% get_recent_news limit=5 as recent_news %}
{% include "multilingual_news/recent.html" with object_list=recent_news %}

You might want to filter recent news by a category. Just add the relevant category slug:

{% get_recent_news category='category-slug' as recent_news %}

If you want to render recent news on a news detail page, you might want to exclude the current news from the queryset:

{% get_recent_news exclude=object as recent_news %}

get_newsentry_meta_description and get_newsentry_meta_title

To render the best matching title or description from the SEO fields, you can use the template tags get_newsentry_meta_description and get_newsentry_meta_title.

<title>{% get_newsentry_meta_title entry_instance %}</title>
<meta name="description" content="{% get_newsentry_meta_description entry_instance %}" />

Twitter Bootstrap 3

List of Bootstrap compatible features:

  • A delete confirmation modal for deleting news entries.

For support of the Twitter Bootstrap 3 functionality, you need to add the Bootstrap js library to your template. If you haven't already

<script type="text/javascript" src=""></script>

Delete confirmation modal

Add the following markup to your template.

{% load static %}

{# add this before bootstrap.js #}
<script type="text/javascript" src="{% static "django_libs/js/modals.js" %}"></script>

<div id="ajax-modal" class="modal fade" tabindex="-1">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        <div class="modal-body">

To trigger the modal, create a link that looks like this.

<a href="{% url "news_delete" %}" data-class="toggleDeleteModal">Delete</a>



Default: 10

Amount of news entries to display in the list view.


If you want to contribute to this project, please perform the following steps

# Fork this repository
# Clone your fork
mkvirtualenv -p python2.7 django-multilingual-news
make develop

git co -b feature_branch master
# Implement your feature and tests
git add . && git commit
git push -u origin feature_branch
# Send us a pull request for your feature branch

In order to run the tests, simply execute tox. This will install two new environments (for Django 1.8 and Django 1.9) and run the tests against both environments.