If you’re starting from a Django project without Wagtail integration and you want to add a blog site to your project, please follow the steps outlined under Standalone blog app. If you are already using Wagtail, refer to Installation on top of Wagtail.

Standalone blog app

  1. Install Puput and its dependencies via pip install puput.
  2. Append PUPUT_APPS to INSTALLED_APPS in your settings.
from puput import PUPUT_APPS


This includes Puput, Wagtail’s apps and certain third-party dependencies. If you are already referencing one of these apps in your INSTALLED_APPS list, please include the following apps manually in order to avoid app collisions:

  1. Add Wagtail’s required middleware classes to MIDDLEWARE_CLASSES in your Django settings.
  1. Add the request context processor to the TEMPLATE_CONTEXT_PROCESSORS structure in your Django settings.
  1. Set the WAGTAIL_SITE_NAME variable to the name of your site in your Django settings.
WAGTAIL_SITE_NAME = 'Puput blog'
  1. Configure the MEDIA_ROOT and MEDIA_URL settings as described in the Wagtail Docs.
MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media')
MEDIA_URL = '/media/'
  1. Place Puput’s URLs at the bottom of the urlpatterns. It also includes Wagtail’s URLs.
urlpatterns = [
    path(r'', include('puput.urls')),
  1. To make your Django project serve your media files (e.g. things you upload via the admin) during development, don’t forget to add this to your urlpatterns:
from django.conf import settings
from django.conf.urls import url

if settings.DEBUG:
    import os
    from django.conf.urls.static import static
    from django.views.generic.base import RedirectView
    from django.contrib.staticfiles.urls import staticfiles_urlpatterns

    urlpatterns += staticfiles_urlpatterns() # tell gunicorn where static files are in dev mode
    urlpatterns += static(settings.MEDIA_URL + 'images/', document_root=os.path.join(settings.MEDIA_ROOT, 'images'))
    urlpatterns += [
        url(r'^favicon\.ico$', RedirectView.as_view(url=settings.STATIC_URL + 'myapp/images/favicon.ico')),
  1. Run python migrate and python puput_initial_data to load initial data to start a blog site.
  2. Open your browser at to view your blog home page. Go to to view the admin site and edit your content.

Installation on top of Wagtail

  1. This assumes that you have Wagtail >= 2.0 installed and you can access /admin; if this is not the case or you would like to use a newer version of Wagtail than is in the dependencies of puput, follow the steps below in a python venv:
pip install --upgrade pip
pip install wheel
pip install wagtail django-colorful django-el-pagination django-social-share
pip install --no-deps puput
wagtail start mysite
cd mysite
python migrate
python createsuperuser
  1. If you haven’t already, install Puput and its dependencies via pip install puput.
  2. In your Django settings (most commonly settings/ inside the wagtail directory), add the following to the INSTALLED_APPS following the wagtail section:
  1. In the same file, also add the line PUPUT_AS_PLUGIN = True to the very bottom
  2. In the same folder, add to near the top from puput import urls as puput_urls and just above url(r'', include(wagtail_urls)), add url(r'',include(puput_urls)),
  3. Run python migrate followed by python runserver 0:8000 to start the server
  4. To create a Puput blog navigate to the Wagtail admin interface at and create a new child page of type Blog. Every blog post is then created as a child of this blog.


If you want to run Puput in a Docker container please visit docker-puput for detailed instructions.