Django Tutorial Part 7: Create a Contact Form with Email Sending (2025 Beginner Guide)

Django Tutorial Part 7: Create a Contact Form with Email Sending (2025 Beginner Guide)
Welcome to Part 7 of our Django beginner series! Today we’ll build a working contact form that sends messages to your email. This is ideal for feedback forms, contact pages, or customer inquiries.

What You’ll Learn

  • Create a contact form using Django forms
  • Send form data via email
  • Configure email backend for development
  • Display success messages

Step 1: Configure Email Settings

In your settings.py, add these for development (console backend):
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
EMAIL_HOST = 'smtp.example.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'your@email.com'
EMAIL_HOST_PASSWORD = 'your-password'
Note: Use console backend for testing. For real email, use SMTP settings (like Gmail, SendGrid, etc).

Step 2: Create the Contact Form

In forms.py:
from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(max_length=100)
    email = forms.EmailField()
    subject = forms.CharField(max_length=200)
    message = forms.CharField(widget=forms.Textarea)

Step 3: Create the Contact View

In views.py:
from django.core.mail import send_mail
from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import ContactForm

def contact_view(request):
    form = ContactForm()
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            subject = form.cleaned_data['subject']
            message = f"From: {form.cleaned_data['name']} <{form.cleaned_data['email']}>\n\n{form.cleaned_data['message']}"
            from_email = form.cleaned_data['email']
            send_mail(subject, message, from_email, ['admin@yourdomain.com'])
            messages.success(request, 'Your message has been sent successfully.')
            return redirect('contact')
    return render(request, 'myapp/contact.html', {'form': form})

Step 4: Create the Template

In templates/myapp/contact.html:
<h2>Contact Us</h2>

{% if messages %}
  {% for message in messages %}
    <p style="color: green;">{{ message }}</p>
  {% endfor %}
{% endif %}

<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Send Message</button>
</form>

Step 5: Add URL Pattern

In myapp/urls.py:
from . import views

urlpatterns = [
    # ... other urls
    path('contact/', views.contact_view, name='contact'),
]

Step 6: Test the Form

Start the development server:
python manage.py runserver
Go to http://127.0.0.1:8000/contact/ and test the form. If using the console backend, the message will appear in your terminal.

Optional: Use HTML Email

If you want to send HTML-formatted messages:
from django.core.mail import EmailMessage

email = EmailMessage(subject, message, from_email, ['admin@yourdomain.com'])
email.content_subtype = "html"
email.send()

Conclusion

You now have a working contact form with email functionality in Django! This feature is essential for communication and adds professionalism to your project. Coming Up in Part 8: We’ll implement pagination and search to organize large content lists efficiently!