Learn how to create an email signature generator using Django. Easy steps, clear instructions, and a beautiful UI. Perfect for enhancing your Django skills!
Creating an email signature generator with Django is a great way to learn web development while building a practical tool. This project will guide you through setting up a web application where users can create professional email signatures easily. With step-by-step instructions, you’ll implement a form for users to input their details, style the signature with a clean design, and even allow users to upload a profile image. Whether you're new to Django or looking to expand your skills, this tutorial will provide a hands-on learning experience.
Prerequisites
Before we dive in, make sure you have a basic understanding of Django and web development. You'll need the following tools and libraries installed on your machine:
- Python (version 3.6 or higher)
- Django (version 3.0 or higher)
- A text editor or IDE (such as VS Code or PyCharm)
- Basic knowledge of HTML and CSS
Setting Up the Development Environment
Installing Django
Before starting, ensure you have Python installed. You can install Django using pip:
pip install django
Creating a new Django project
Create a new Django project using the following command:
django-admin startproject signature_generator
Setting up the project structure
Navigate into your project directory:
cd signature_generator
Create a Django App
Create a new app within your project:
python manage.py startapp generator
Adding the app to the project
In signature_generator/settings.py
, add generator
to the INSTALLED_APPS
list:
INSTALLED_APPS = [ 'generator', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
Creating the Email Signature Generator App
Create Forms
You’ll need a form where users can enter their details. In generator, create a new file named forms.py and add the following function:
from django import forms class SignatureForm(forms.Form): name = forms.CharField( label='Name', max_length=100, widget=forms.TextInput(attrs={'class': 'form-control'}) ) title = forms.CharField( label='Title', max_length=100, widget=forms.TextInput(attrs={'class': 'form-control'}) ) email = forms.EmailField( label='Email', widget=forms.EmailInput(attrs={'class': 'form-control'}) ) phone = forms.CharField( label='Phone', max_length=15, required=False, widget=forms.TextInput(attrs={'class': 'form-control'}) ) website = forms.URLField( label='Website', required=False, widget=forms.URLInput(attrs={'class': 'form-control'}) ) image = forms.ImageField( label='Profile Image', required=False, widget=forms.ClearableFileInput(attrs={'class': 'form-control'}) )
Create Views
Next, we’ll create views that handles the form submission and renders the signature. Open generator/views.py
and add the following:
from django.shortcuts import render from .forms import SignatureForm from django.core.files.storage import FileSystemStorage def generate_signature(request): if request.method == 'POST': form = SignatureForm(request.POST, request.FILES) if form.is_valid(): image_url = '' if request.FILES.get('image'): image = request.FILES['image'] fs = FileSystemStorage() filename = fs.save(image.name, image) image_url = fs.url(filename) context = { 'name': form.cleaned_data['name'], 'title': form.cleaned_data['title'], 'email': form.cleaned_data['email'], 'phone': form.cleaned_data.get('phone', ''), 'website': form.cleaned_data.get('website', ''), 'image_url': image_url, } return render(request, 'signature_result.html', context) else: form = SignatureForm() return render(request, 'signature_form.html', {'form': form})
Create Templates
Create a templates directory within the generator app and then create base.html
, signature_form.html
, and signature_result.html
inside this directory.
Base Template (base.html)
:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Email Signature Generator</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel='stylesheet' href='https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'> <style> body { margin: 0; font-family: 'Poppins', sans-serif; padding: 20px; } .signature-card { font-family: Arial, sans-serif; border: 1px solid #ddd; padding: 15px; width: 100%; max-width: 450px; background-color: #f9f9f9; margin: 20px 0; } </style> </head> <body> <div class="container"> {% block content %} {% endblock %} </div> </body> </html>
signature_form.html
:
{% extends 'base.html' %} {% block content %} <h1 class="mb-4">Generate Your Email Signature</h1> <form method="post" enctype="multipart/form-data"> {% csrf_token %} <div class="mb-3"> {{ form.name.label_tag }} {{ form.name }} </div> <div class="mb-3"> {{ form.title.label_tag }} {{ form.title }} </div> <div class="mb-3"> {{ form.email.label_tag }} {{ form.email }} </div> <div class="mb-3"> {{ form.phone.label_tag }} {{ form.phone }} </div> <div class="mb-3"> {{ form.website.label_tag }} {{ form.website }} </div> <div class="mb-3"> {{ form.image.label_tag }} {{ form.image }} </div> <button type="submit" class="btn btn-primary">Generate Signature</button> </form> {% endblock %}
signature_result.html
:
{% extends 'base.html' %} {% block content %} <h1 class="mb-4">Your Email Signature</h1> <div class="signature-card"> <table cellpadding="0" cellspacing="0" border="0" style="font-family: Arial, sans-serif;"> <tr> {% if image_url %} <td style="padding-right:20px"> <img src="{{ image_url }}" alt="Profile Image" class="signature-image" style="border-radius: 50%; width: 80px; height: 80px; margin-right: 7px;"> <div style="width: 5px; height: 80px; background:#75c8fd; float: right"></div> </td> {% endif %} <td style="vertical-align: top;"> <p style="margin: 0; font-size: 16px; font-weight: bold; color: #333;">{{ name }}</p> <p style="margin: 0; font-size: 14px; font-weight: bold; color: #555;">{{ title }}</p> <p style="margin: 10px 0 0 0; font-size: 12px;"> <strong>Email:</strong> <a href="mailto:{{ email }}" style="color: #1a73e8; text-decoration: none;">{{ email }}</a> </p> {% if phone %} <p style="margin: 3px 0 0 0; font-size: 12px;"> <strong>Phone:</strong> <a href="tel:{{ phone }}" style="color: #1a73e8; text-decoration: none;">{{ phone }}</a> </p> {% endif %} {% if website %} <p style="margin: 3px 0 0 0; font-size: 12px;"> <strong>Website:</strong> <a href="{{ website }}" style="color: #1a73e8; text-decoration: none;">{{ website }}</a> </p> {% endif %} </td> </tr> </table> </div> <br> <a href="{% url 'generate_signature' %}" class="btn btn-secondary">Generate Another</a> {% endblock %}
Configure Media Settings
Ensure your settings.py
is configured to handle media files:
# signature_generator/settings.py MEDIA_URL = '/media/' MEDIA_ROOT = BASE_DIR / 'media'
Set Up URL Routing
Add a URL pattern for your view. In generator/urls.py (create this file if it doesn't exist), add:
from django.urls import path from .views import generate_signature urlpatterns = [ path('', generate_signature, name='generate_signature'), ]
Include the app's URLs in your project's URL configuration. Open signature_generator/urls.py and include the Email Signature Generator app URLs:
from django.conf import settings from django.conf.urls.static import static from django.contrib import admin from django.urls import include, path urlpatterns = [ path('admin/', admin.site.urls), path('', include('generator.urls')), ] if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Run the Server
Finally, run the server and test your email signature generator:
python manage.py runserver
Visit http://127.0.0.1:8000/ in your browser to see the signature generator in action.
Full Email Signature Generator App Project Structure
signature_generator/ │ ├── signature_generator/ # Project settings and configuration │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ ├── generator/ # Django app │ ├── migrations/ # Database migrations │ │ └── __init__.py │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py # Form definition │ ├── models.py # Models (if any) │ ├── tests.py │ ├── urls.py # App-specific URLs │ └── views.py # Views for handling requests │ ├── templates/ # HTML templates │ └── base.html # Base template with common layout │ └──signature_form.html # Form for generating signatures │ └── signature_result.html # Display generated signature ├── media/ # Folder for uploaded media files │ ├── manage.py # Django management script └── requirements.txt # Project dependencies
Conclusion
In this guide, we've covered how to build a functional and visually appealing email signature generator using Django. By following the steps, you now have a web application that allows users to create custom email signatures with ease. This project not only enhances your Django skills but also adds a useful tool to your portfolio. Feel free to customize and expand the project further to fit your needs or explore new features.
That’s a wrap!
I hope you enjoyed this article
Did you like it? Let me know in the comments below 🔥 and you can support me by buying me a coffee.
And don’t forget to sign up to our email newsletter so you can get useful content like this sent right to your inbox!
Thanks!
Faraz 😊