Skip to main content

Allow everybody to unsubscribe your messages, user accounts are not required.

Project description Documentation Status coverage CodeCov coverage Maintainability License Tweet about this project!-1EAEDB.svg

Allow everybody to unsubscribe your messages, user accounts are not required.


  • A single page form for opt-out feedback submission
  • Feedback options text controlled from django admin
  • Predefined feedback defaults available from django manage command
  • Feedback translations done in django admin
  • Feedback options selection based on tags supplied to the opt-out url
  • Ability to preselect a feedback option
  • Ability to change selected feedback options after submission
  • Ability to set tag:value pair on opt-out url and store them on submission with user feedback
  • Signal to modify opt-out form before rendering
  • Signal on opt-out feedback submission
  • Easily overridable thank you / goodbye view
  • Opt-out form with a easily overridable base template


To run an example project for this django reusable app, click the button below and start a demo serwer on Heroku

Deploy Django Opt-out example project to Heroku Deploy Django Opt-out example project to Heroku


Install Django Opt-out application:

pip install django-opt-out

Add it to your INSTALLED_APPS:


Add Django Opt-out application’s URL patterns:

from django_opt_out import urls as django_opt_out_urls

urlpatterns = [
    url(r'^', include(django_opt_out_urls)),

Add unsubscribe links to your emails:

from django_opt_out.utils import get_opt_out_path
email='Django Opt-out <>'
unsubscribe = get_opt_out_path(email, 'some', 'tags', 'controlling', 'questionnaire')

# unsubscribe link will not have a domain name and scheme
# you can build prefix from request, but I prefer to set it in settings
from django.conf import settings
unsubscribe = settings.BASE_URL + unsubscribe
body = 'Hello, Regards\n\nUnsubscribe: ' + unsubscribe

from django.core import mail
message = mail.EmailMultiAlternatives(body=body, to=[email])
message.extra_headers['List-Unsubscribe'] = "<{}>".format(unsubscribe)

Running Tests

Does the code actually work?

source <YOURVIRTUALENV>/bin/activate
(myenv) $ pip install tox
(myenv) $ tox


This package was created with Cookiecutter and the wooyek/cookiecutter-django-app project template.


0.1.0 (2017-11-03)

  • First release on PyPI.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for django-opt-out, version 0.9.6
Filename, size File type Python version Upload date Hashes
Filename, size django_opt_out-0.9.6-py2.py3-none-any.whl (33.7 kB) File type Wheel Python version 3.6 Upload date Hashes View
Filename, size django-opt-out-0.9.6.tar.gz (197.6 kB) File type Source Python version None Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page