High-Level Approach
Creating a contact page in Django involves creating a new app, adding it to the project settings, and defining a model for the contact form. You then create a form for the model, a view to handle form submission and display, and a URL for the view. Finally, you create templates for the form and a success page, and run the server to view your contact form.
Here’s a step-by-step guide:
Step 1: Create a new Django app
First, you need to create a new Django app. In your terminal, navigate to your Django project directory and run the following command:
python manage.py startapp contact
This will create a new Django app named ‘contact‘.
Step 2: Add the app to your project settings
Open your Django project’s settings file (usually settings.py) and add your new app to the INSTALLED_APPS list:
INSTALLED_APPS = [
...
'contact',
...
]
Step 3: Create a model for the contact form
In the models.py file of your new app, create a model for the contact form. This model will define the fields of the form.
Here’s a basic example:
from django.db import models
class Contact(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
message = models.TextField()
Step 4: Create a form for the model
In the same directory, create a new file named forms.py and define a form for your model:
from django import forms
from .models import Contact
class ContactForm(forms.ModelForm):
class Meta:
model = Contact
fields = ['name', 'email', 'message']
Step 5: Create a view for the form
In the views.py file of your app, create a view for your form:
from django.shortcuts import render
from .forms import ContactForm
def contact_view(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
form.save()
return render(request, 'contact/success.html')
else:
form = ContactForm()
return render(request, 'contact/contact.html', {'form': form})
This view will display the contact form when the page is visited, and it will save the form data when the form is submitted.
Step 6: Create a URL for the view
In the urls.py file of your app, create a URL for your view:
from django.urls import path
from .views import contact_view
urlpatterns = [
path('contact/', contact_view, name='contact'),
]
Step 7: Create templates for the form and the success page
In your app’s templates directory (you might need to create it), create a new directory named ‘contact’ and inside it, create two HTML files: contact.html and success.html. The contact.html file should contain the form, and the success.html file should contain a message that will be displayed when the form is successfully submitted.
Step 8: Run the server
Finally, run your server with python manage.py runserver and visit http://localhost:8000/contact/ to see your contact form.
Remember to replace ‘contact‘ with the actual name of your app if it’s different. Also, this is a very basic example. In a real-world application, you would probably want to add more features, like sending an email when the form is submitted, validating the form data, etc.
Example: Portfolio Website Django
We will create a contact page so anyone who wants to pass information or suggestions can reach us. We have already created a contact page while building a portfolio website using Django. Please go through that tutorial for more explanation because we will do exactly what we did there.
Add this Contact class to your models.py file:
from datetime import datetime
class Contact(models.Model):
name = models.CharField(max_length=50)
subject = models.CharField(max_length=200)
email = models.EmailField()
submitted_on = models.DateTimeField(default=datetime.now)
message = models.TextField()
def __str__(self):
return self.name
Perform migrations and proceed to create a ContactForm class in your forms.py file.
class ContactForm(forms.ModelForm):
name = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Name'}))
email = forms.EmailField(widget=forms.TextInput(attrs={'placeholder': 'Email'}))
subject = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Subject'}))
message = forms.CharField(widget=forms.Textarea(attrs={'placeholder': 'Message'}))
class Meta:
model = Contact
fields = ('name', 'email', 'subject', 'message')
For the admin interface, letβs create the class in admin.py file.
class ContactAdmin(admin.ModelAdmin):
list_display = ('name', 'email', 'subject', 'message')
admin.site.register(Contact, ContactAdmin)

Be sure to import all the necessary modules. For the view function:
from django.views.generic import CreateView
from django.contrib.messages.views import SuccessMessageMixin
from .forms import ContactForm
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.urls import reverse_lazy
class ContactView(SuccessMessageMixin, CreateView):
form_class = ContactForm
success_url = reverse_lazy('index')
template_name = 'contact.html'
success_message = 'Your message was submitted successfully'
def form_invalid(self, form):
message.error(self.request, 'An unknown error has occurred!')
return HttpResponseRedirect('')

letβs now create the template using the name we specified in the ContactView class.
{% extends 'base.html' %}
{% block content %}
<div class="col-md-8 card mb-4 mt-3">
<h1 align="center">Contact Form</h1>
<hr>
<p>We want to hear from you. Please fill out this contact form for suggestions.</p>
<hr>
<br>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-primary btn-lg">Submit</button>
</form>
</div>
{% endblock %}
You are free to use the Django crispy forms as demonstrated in that project. For the endpoint, it will be like this:
path('contact', ContactView.as_view(), name='contact'),