Django Opt-out demo

by wooyek


Django Opt-out application

Documentation Status coverage CodeCov coverage Maintainability License Tweet about this project

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.