How to Add a Newsletter App to Your Django Website

Add Simple Newsletter to your Django Project
January 14, 2025 by
How to Add a Newsletter App to Your Django Website
Hamed Mohammadi
| No comments yet

Newsletters are an excellent way to engage with your audience and keep them updated with the latest content, news, and updates from your website. If you're using Django and want to add a newsletter app to your project, this guide will walk you through the process step by step.

Step 1: Define Your Newsletter’s Features

Before diving into coding, outline what you want your newsletter app to do. Here are some common features you might include:

  • A subscription form for users to sign up.
  • A database to store subscribers’ information.
  • A way to send newsletters to your subscribers.
  • Email templates for designing your newsletters.
  • An admin interface to manage subscribers and newsletters.

Step 2: Set Up a Django App

First, create a new app in your Django project to handle the newsletter functionality:

python manage.py startapp newsletter

Then, add the app to your INSTALLED_APPS in settings.py:

INSTALLED_APPS = [
    # other apps...
    'newsletter',
]

Step 3: Create Models

In newsletter/models.py, define models for storing subscriber information and newsletters:

from django.db import models

class Subscriber(models.Model):
    email = models.EmailField(unique=True)
    subscribed_on = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.email

class Newsletter(models.Model):
    subject = models.CharField(max_length=255)
    content = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    sent_on = models.DateTimeField(null=True, blank=True)

    def __str__(self):
        return self.subject

Apply the migrations to create these tables in your database:

python manage.py makemigrations
python manage.py migrate

Step 4: Create a Subscription Form

Add a form in newsletter/forms.py to handle subscriptions:

from django import forms
from .models import Subscriber

class SubscriptionForm(forms.ModelForm):
    class Meta:
        model = Subscriber
        fields = ['email']
        widgets = {
            'email': forms.EmailInput(attrs={
                'placeholder': 'Enter your email',
                'class': 'form-control',
            }),
        }

Step 5: Create Views

In newsletter/views.py, add views to handle subscriptions and display newsletters:

from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import SubscriptionForm
from .models import Subscriber, Newsletter

def subscribe(request):
    if request.method == 'POST':
        form = SubscriptionForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, 'Thank you for subscribing!')
            return redirect('home')  # Replace 'home' with your desired redirect URL
    else:
        form = SubscriptionForm()
    return render(request, 'newsletter/subscribe.html', {'form': form})

def newsletter_list(request):
    newsletters = Newsletter.objects.all().order_by('-created_on')
    return render(request, 'newsletter/newsletter_list.html', {'newsletters': newsletters})

Step 6: Create Templates

Create templates for your subscription form and newsletter list. For example, in templates/newsletter/subscribe.html:

<h2>Subscribe to our Newsletter</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="btn btn-primary">Subscribe</button>
</form>

And in templates/newsletter/newsletter_list.html:

<h2>Newsletters</h2>
<ul>
    {% for newsletter in newsletters %}
        <li>{{ newsletter.subject }} - {{ newsletter.created_on }}</li>
    {% endfor %}
</ul>

Step 7: Add URLs

Define URLs for your newsletter app in newsletter/urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('subscribe/', views.subscribe, name='subscribe'),
    path('newsletters/', views.newsletter_list, name='newsletter_list'),
]

Include these URLs in your project’s urls.py:

from django.urls import include, path

urlpatterns = [
    # other routes...
    path('newsletter/', include('newsletter.urls')),
]

Step 8: Sending Newsletters

To send newsletters, you can use Django’s send_mail function or integrate with an email service like Mailgun, SendGrid, or Amazon SES. Here’s an example using send_mail:

from django.core.mail import send_mail
from .models import Subscriber

def send_newsletter(newsletter):
    subscribers = Subscriber.objects.values_list('email', flat=True)
    send_mail(
        subject=newsletter.subject,
        message=newsletter.content,
        from_email='your-email@example.com',
        recipient_list=subscribers,
    )

Step 9: Admin Interface

Register your models in newsletter/admin.py to manage them via the admin panel:

from django.contrib import admin
from .models import Subscriber, Newsletter

admin.site.register(Subscriber)
admin.site.register(Newsletter)

Step 10: Style the Subscription Form

Use Bootstrap or another CSS framework to make your forms look polished. For example, you can add classes to the form fields in your SubscriptionForm.

Step 11: Automate Newsletter Sending (Optional)

To automate sending newsletters, use Django’s management commands or a task queue like Celery. For example, you can schedule a task to send newsletters weekly or monthly.

Conclusion

With this guide, you’ve learned how to create a fully functional newsletter app for your Django project. From subscription forms to email sending, these steps will help you engage with your audience effectively.

How to Add a Newsletter App to Your Django Website
Hamed Mohammadi January 14, 2025
Share this post
Tags
Archive

Please visit our blog at:

https://zehabsd.com/blog

A platform for Flash Stories:

https://readflashy.com

A platform for Persian Literature Lovers:

https://sarayesokhan.com

Sign in to leave a comment