• Stars
    star
    145
  • Rank 252,660 (Top 6 %)
  • Language
    JavaScript
  • License
    BSD 3-Clause "New...
  • Created over 12 years ago
  • Updated over 8 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Easy PJAX for Django

Easy PJAX for Django

Enhance the browsing experience of Django sites.

Build Status Latest Version Downloads Wheel License

Developed at en.ig.ma software shop.

What is PJAX?

PJAX utilizes pushState and Ajax to load HTML from the server into the current page without a full reload. It's Ajax with real permalinks, page titles, and a working back button that fully degrades.

Check out the demo that illustrates this concept in practice and take a look at docs of jquery-pjax to get more information.

The django-easy-pjax app is a helper that makes it easy to integrate jquery-pjax with your Django 1.5+ site.

Quick Start

First include django-easy-pjax==1.3 in your requirements.txt file, add easy_pjax to your INSTALLED APPS and make sure you have django.template.context_processors.request added to template context_processors.

If you are using Django 1.9+, you will also need to add the easy_pjax.templatetags.pjax_tags to template builtins in your Django settings:

TEMPLATES=[
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [...],
        "APP_DIRS": True,
        "OPTIONS": {
            "builtins": [
                "easy_pjax.templatetags.pjax_tags"
            ],
            "context_processors": [
                "django.template.context_processors.request",
                "django.template.context_processors.static",
                ...
            ]
        }
    }
]

Then simply add |pjax:request filter inside your site template extends tag:

{% extends "theme_base.html"|pjax:request %}

The pjax filter will decide which layout template should be extended based on HTTP headers. In the example above it will return theme_base.html for regular requests and pjax_base.html for PJAX requests.

A generic pjax_base.html template is provided by this application, but you may need to copy it to your templates root directory and adjust it to match your project's template blocks.

No other modification to views, code or url configuration is required, so integration with other applications shouldn't be a problem.

The template filter also takes a comma-separated names of base and pjax templates as the first parameter:

{% extends "base.html,pjax_base2.html"|pjax:request %}

This is useful if you need to specify another template set.

See the demo.py file and tests directory for working examples.

Unpjax

jquery-pjax uses cache-busting techniques and appends _pjax=true to query string params.

If for some reason you need to remove that param from query strings you can use either the easy_pjax.middleware.UnpjaxMiddleware to remove it from all requests before they are passed to Django views, or the unpjax filter to modify urls emitted in templates:

<a href="{{ request.get_full_path|unpjax }}">

Documentation

The full documentation is at django-easy-pjax.rtfd.org.

A live demo is at easy-pjax.herokuapp.com. You can run it locally after installing dependencies by running python demo.py script from the cloned repository.

Django 1.9

Before Django 1.9 the easy-pjax library used the django.template.base.add_to_builtins private API to automatically register itself in the template built-ins after it was added to the INSTALLED_APPS list. This workaround was due to the fact that the {% load %} tag cannot be placed before the {% extends %} tag and the pjax template filter could not be loaded explicitly.

Starting from Django 1.9 easy-pjax does not have to rely on such workarounds because Django now provides a clean way to add filters and tags to template built-ins. This is now the recommended and the only way of installing easy-pjax template tags, also because the add_to_builtins API was removed.

This is a backward incompatible change, but one that makes the integration more explicit and following the Zen of Python.

Example of configuration settings to be used starting from Django 1.9:

INSTALLED_APPS = [
    "easy_pjax"
]
MIDDLEWARE_CLASSES = [
    "easy_pjax.middleware.UnpjaxMiddleware"
]
TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [],
        "APP_DIRS": True,
        "OPTIONS": {
            "builtins": [
                "easy_pjax.templatetags.pjax_tags"
            ],
            "context_processors": [
                "django.template.context_processors.request",
            ]
        }
    }
]

No changes are required for Django 1.8 or older.

License

django-easy-pjax is released under the BSD license.

Other Resources

Please note that the jquery-pjax JavaScript library in not bundled with this app and you still need to add proper handling to your browser-side code.

Commercial Support

This app and many other help us build better software and focus on delivering quality projects faster. We would love to help you with your next project so get in touch by dropping an email at [email protected].

More Repositories

1

django-easy-pdf

PDF views, the easy way
Python
363
star
2

pywt

We're moving. Please visit https://github.com/PyWavelets
C
167
star
3

heroku-django-cookbook

Collection of snippets that solve certain problems while deploying Django apps to Heroku
128
star
4

StackScripts

A bunch of StackScripts that I use to easily deploy full web+db+django stack at Linode.com
Shell
82
star
5

django-session-activity

List recent account activity and sign-out from all sessions opened on other computers
Python
63
star
6

django-modern-template

Modern Django project template
JavaScript
44
star
7

django-herokuify

Automatic Django configuration and utilities for Heroku
Python
38
star
8

django-request-id

X-Request-Id logging
Python
33
star
9

dj-cmd

Tired of typing `python manage.py runserver`?
Python
26
star
10

django-infinite-pagination

Efficiently paginate large object collections
Python
26
star
11

django-twilio-sms

Twilio integration for SMS-based Django apps
Python
14
star
12

web-screenshots

Sample Flask web app for taking web page screenshots using Selenium PhantomJS driver. Runs on Heroku.
Python
12
star
13

django-common-configs

Convention over configuration. Common settings for Django projects.
Python
10
star
14

jquery-expandme

Small jQuery plugin for expanding images and other content in articles.
JavaScript
5
star
15

sentry-on-dotcloud

Sentry realtime event logging deployment on DotCloud
Python
3
star
16

heroku-centrifuge

Python Centrifuge deployment on Heroku
2
star
17

ai-class-chrome-extension

Chrome Browser Extension for AI Class Forum
JavaScript
2
star
18

djutil

Common django utilities
Python
2
star
19

celery-worker-deadlock-debug

Debugging celery worker hangs and crashes - https://github.com/celery/celery/issues/3898
Python
1
star