Learn how to build a currency converter using Django with this easy-to-follow guide. Perfect for beginners looking to enhance their Python and web development skills.
Creating a currency converter using Django is a great way to improve your web development skills. Whether you're a beginner or someone looking to brush up on your Django knowledge, this guide will walk you through the process step by step. By the end of this tutorial, you'll have a fully functional currency converter that you can use as part of a larger project or just as a standalone tool.
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 currency_converter
Setting up the project structure
Navigate into your project directory:
cd currency_converter
Create a Django App
Create a new app within your project:
python manage.py startapp converter
Adding the app to the project
In currency_converter/settings.py, add converter to the INSTALLED_APPS list:
INSTALLED_APPS = [
'converter',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Creating the Currency Converter App
Create Forms
In converter, create a new file named forms.py and add the following function:
from django import forms
class ConversionForm(forms.Form):
amount = forms.DecimalField(
max_digits=10,
decimal_places=2,
label='Amount',
widget=forms.NumberInput(attrs={'class': 'form-control'})
)
from_currency = forms.ChoiceField(
choices=[
('USD', 'USD'),
('EUR', 'EUR'),
('GBP', 'GBP'),
('INR', 'INR'),
('SAR', 'SAR'),
('KWD', 'KWD')
# Add more currencies as needed
],
label='From Currency',
widget=forms.Select(attrs={'class': 'form-control'})
)
to_currency = forms.ChoiceField(
choices=[
('INR', 'INR'),
('USD', 'USD'),
('EUR', 'EUR'),
('GBP', 'GBP'),
('SAR', 'SAR'),
('KWD', 'KWD')
# Add more currencies as needed
],
label='To Currency',
widget=forms.Select(attrs={'class': 'form-control'})
)
Create Views
Next, we’ll create views. Open converter/views.py and add the following:
from django.shortcuts import render
from .forms import ConversionForm
from decimal import Decimal, ROUND_HALF_UP
import requests
def convert_currency(amount, from_currency, to_currency):
url = f"https://api.exchangerate-api.com/v4/latest/{from_currency}"
response = requests.get(url)
data = response.json()
rate = data['rates'].get(to_currency, 1)
if isinstance(rate, float):
rate = Decimal(rate)
amount_decimal = Decimal(amount)
converted_amount = amount_decimal * rate
converted_amount = converted_amount.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
return converted_amount
def home(request):
result = None
if request.method == 'POST':
form = ConversionForm(request.POST)
if form.is_valid():
amount = form.cleaned_data['amount']
from_currency = form.cleaned_data['from_currency']
to_currency = form.cleaned_data['to_currency']
converted_amount = convert_currency(amount, from_currency, to_currency)
result = f"{to_currency} {converted_amount}"
else:
form = ConversionForm()
return render(request, 'home.html', {'form': form, 'result': result})
Set Up URL Routing
Add a URL pattern for your view. In converter/urls.py (create this file if it doesn't exist), add:
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
]
Include the app's URLs in your project's URL configuration. Open currency_converter/urls.py and include the currency converter app URLs:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('converter.urls')),
]
Create Templates
Create a templates directory within the currency converter app and then create home.html file inside this directory.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Currency Converter</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
<style>
body {
background: linear-gradient(to right, #00c6ff, #0072ff);
font-family: 'Arial', sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.container {
max-width: 400px;
width: 100%;
}
.converter-card {
background: #ffffff;
border-radius: 15px;
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
padding: 20px;
}
.converter-card-header {
background: #0072ff;
color: white;
padding: 15px;
border-radius: 15px 15px 0 0;
text-align: center;
font-size: 1.5em;
font-weight: bold;
}
.card-body {
padding: 20px;
}
.form-group {
margin-bottom: 15px;
}
.form-control {
border-radius: 10px;
}
.btn-primary {
background: #0072ff;
border: none;
border-radius: 10px;
padding: 10px 20px;
transition: background 0.3s;
}
.btn-primary:hover {
background: #0056b3;
}
.result {
text-align: center;
}
.result h2 {
font-size: 1.2em;
color: #333;
}
</style>
</head>
<body>
<div class="container">
<div class="converter-card">
<div class="converter-card-header">
<i class="fas fa-exchange-alt"></i> Currency Converter
</div>
<div class="card-body">
<form method="post">
{% csrf_token %}
<div class="form-group">
{{ form.amount.label_tag }}
{{ form.amount}}
{% for error in form.amount.errors %}
<div class="text-danger">{{ error }}</div>
{% endfor %}
</div>
<div class="form-group">
{{ form.from_currency.label_tag }}
{{ form.from_currency}}
{% for error in form.from_currency.errors %}
<div class="text-danger">{{ error }}</div>
{% endfor %}
</div>
<div class="form-group">
{{ form.to_currency.label_tag }}
{{ form.to_currency}}
{% for error in form.to_currency.errors %}
<div class="text-danger">{{ error }}</div>
{% endfor %}
</div>
<button type="submit" class="btn btn-primary w-100">Convert</button>
</form>
</div>
{% if result %}
<div class="result">
<h2>Converted Amount: {{ result }}</h2>
</div>
{% endif %}
</div>
</div>
</body>
</html>
Run Your Server
Run migrations:
python manage.py makemigrations python manage.py migrate
Run the development server:
python manage.py runserver
Open your browser and go to http://127.0.0.1:8000 to see your currency converter app in action.
Full Currency Converter App Project Structure
currency_converter/ │ ├── converter/ # Main app directory │ ├── migrations/ # Database migrations │ │ ├── __init__.py │ │ │ ├── templates/ # HTML templates │ │ └── home.html │ │ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py # Django forms │ ├── models.py # Models (if any) │ ├── tests.py # Unit tests │ ├── urls.py # App-specific URLs │ ├── views.py # Views │ └── utils.py # Utility functions like currency conversion │ ├── currency_converter/ # Main project directory │ ├── __init__.py │ ├── asgi.py │ ├── settings.py # Project settings │ ├── urls.py # Project-level URLs │ ├── wsgi.py │ ├── manage.py # Django management script └── requirements.txt # Dependencies (optional)
Conclusion
Building a currency converter with Django is a practical project that helps you understand the basics of web development, Python, and Django. It's not only a great way to learn, but also a useful tool that you can customize and expand upon. By following this guide, you now have a working currency converter and the skills to create even more complex web applications with Django.
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 😊

