Python Django Error during rendering "template"
This is what im building
I am currently developing a receipt system and when i run the application, i get this error, i have checked the settings.py and my app has been added to the list of installed apps, my templates are also in place and the problem is still existent,please assist if there is somewhere else i need to check , Below is the error i get when i try run the application
This is the error
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/
Django Version: 5.2.1
Python Version: 3.12.3
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'receiptsiclife']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Template loader postmortem
Django tried loading these templates, in this order:
Using engine django:
* django.template.loaders.filesystem.Loader: /home/aessumen/receiptsystemsiclife/receiptsystemsiclife/templates/base.html (Source does not exist)
* django.template.loaders.app_directories.Loader: /home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/contrib/admin/templates/base.html (Source does not exist)
* django.template.loaders.app_directories.Loader: /home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/contrib/auth/templates/base.html (Source does not exist)
* django.template.loaders.app_directories.Loader: /home/aessumen/receiptsystemsiclife/receiptsystemsiclife/receiptsiclife/templates/base.html (Source does not exist)
Template error:
In template /home/aessumen/receiptsystemsiclife/receiptsystemsiclife/receiptsiclife/templates/receiptsiclife/home.html, error at line 1
base.html
1 : {% extends 'base.html' %}
2 :
3 : {% block title %}Dashboard - ReceiptSicLife{% endblock %}
4 :
5 : {% block content %}
6 : <div class="row">
7 : <div class="col-md-12">
8 : <h1>Dashboard</h1>
9 : <div class="row mt-4">
10 : <div class="col-md-4">
11 : <div class="card bg-primary text-white">
Traceback (most recent call last):
File "/home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render
return self.template.render(context)
File "/home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render
return self._render(context)
File "/home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render
return self.nodelist.render(context)
File "/home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated
return self.render(context)
File "/home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 134, in render
compiled_parent = self.get_parent(context)
File "/home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 131, in get_parent
return self.find_template(parent, context)
File "/home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 109, in find_template
template, origin = context.template.engine.find_template(
File "/home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/template/engine.py", line 163, in find_template
raise TemplateDoesNotExist(name, tried=tried)
The above exception (base.html) was the direct cause of the following exception:
File "/home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
File "/home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/aessumen/receiptsystemsiclife/receiptsystemsiclife/receiptsiclife/views.py", line 21, in home
return render(request, 'receiptsiclife/home.html', context)
File "/home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/shortcuts.py", line 25, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "/home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/template/loader.py", line 62, in render_to_string
return template.render(context, request)
File "/home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/template/backends/django.py", line 109, in render
reraise(exc, self.backend)
File "/home/aessumen/receiptsystemsiclife/venv/lib/python3.12/site-packages/django/template/backends/django.py", line 130, in reraise
raise new from exc
Exception Type: TemplateDoesNotExist at /
Exception Value: base.html
" MODELS.PY
from django.db import models
from django.db import models
from django.core.mail import EmailMessage
from django.conf import settings
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch
from reportlab.lib import colors
from io import BytesIO
import os
from datetime import datetime
class Student(models.Model):
PROGRAM_CHOICES = [
('computer_science', 'Computer Science'),
('business_admin', 'Business Administration'),
('engineering', 'Engineering'),
('medicine', 'Medicine'),
('law', 'Law'),
('education', 'Education'),
]
student_name = models.CharField(max_length=200)
dob = models.DateField(verbose_name="Date of Birth")
program = models.CharField(max_length=50, choices=PROGRAM_CHOICES)
email = models.EmailField()
parents_name = models.CharField(max_length=200)
parents_contact = models.CharField(max_length=20)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"{self.student_name} - {self.program}"
class Meta:
verbose_name = "Student"
verbose_name_plural = "Students"
class Payment(models.Model):
PAYMENT_STATUS_CHOICES = [
('pending', 'Pending'),
('completed', 'Completed'),
('failed', 'Failed'),
('refunded', 'Refunded'),
]
PAYMENT_METHOD_CHOICES = [
('cash', 'Cash'),
('card', 'Credit/Debit Card'),
('bank_transfer', 'Bank Transfer'),
('mobile_money', 'Mobile Money'),
]
student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name='payments')
amount = models.DecimalField(max_digits=10, decimal_places=2)
payment_date = models.DateTimeField(auto_now_add=True)
payment_method = models.CharField(max_length=20, choices=PAYMENT_METHOD_CHOICES)
status = models.CharField(max_length=20, choices=PAYMENT_STATUS_CHOICES, default='pending')
description = models.TextField(blank=True, null=True)
receipt_number = models.CharField(max_length=50, unique=True, blank=True)
def save(self, *args, **kwargs):
if not self.receipt_number:
# Generate unique receipt number
self.receipt_number = f"REC-{datetime.now().strftime('%Y%m%d')}-{self.id or '000'}"
# If payment status changes to completed, generate and send receipt
if self.status == 'completed' and self.pk:
old_status = Payment.objects.get(pk=self.pk).status if self.pk else None
if old_status != 'completed':
super().save(*args, **kwargs)
self.generate_and_send_receipt()
return
super().save(*args, **kwargs)
def generate_pdf_receipt(self):
"""Generate PDF receipt"""
buffer = BytesIO()
doc = SimpleDocTemplate(buffer, pagesize=letter, rightMargin=72, leftMargin=72,
topMargin=72, bottomMargin=18)
# Container for PDF elements
elements = []
styles = getSampleStyleSheet()
# Custom styles
title_style = ParagraphStyle(
'CustomTitle',
parent=styles['Heading1'],
fontSize=24,
spaceAfter=30,
alignment=1, # Center alignment
textColor=colors.HexColor('#2E86AB')
)
header_style = ParagraphStyle(
'CustomHeader',
parent=styles['Heading2'],
fontSize=16,
spaceAfter=12,
textColor=colors.HexColor('#A23B72')"
" URLS.PY
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
path('students/', views.student_list, name='student_list'),
path('students/add/', views.student_create, name='student_create'),
path('students/<int:pk>/', views.student_detail, name='student_detail'),
path('payments/', views.payment_list, name='payment_list'),
path('payments/add/', views.payment_create, name='payment_create'),
path('payments/<int:pk>/', views.payment_detail, name='payment_detail'),
path('payments/<int:pk>/receipt/', views.download_receipt, name='download_receipt'),
] "
" VIEW.PY
from django.shortcuts import render
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from django.http import HttpResponse, JsonResponse
from django.views.generic import ListView
from .models import Student, Payment
from .forms import StudentForm, PaymentForm
def home(request):
"""Home page view"""
recent_payments = Payment.objects.filter(status='completed')[:5]
total_students = Student.objects.count()
total_payments = Payment.objects.filter(status='completed').count()
context = {
'recent_payments': recent_payments,
'total_students': total_students,
'total_payments': total_payments,
}
return render(request, 'receiptsiclife/home.html', context)
def student_create(request):
"""Create new student"""
if request.method == 'POST':
form = StudentForm(request.POST)
if form.is_valid():
student = form.save()
messages.success(request, f'Student {student.student_name} created successfully!')
return redirect('student_list')
else:
form = StudentForm()
return render(request, 'receiptsiclife/student_form.html', {'form': form, 'title': 'Add New Student'})
def student_list(request):
"""List all students"""
students = Student.objects.all().order_by('-created_at')
return render(request, 'receiptsiclife/student_list.html', {'students': students})
def student_detail(request, pk):
"""Student detail view"""
student = get_object_or_404(Student, pk=pk)
payments = student.payments.all().order_by('-payment_date')
return render(request, 'receiptsiclife/student_detail.html', {
'student': student,
'payments': payments
})
def payment_create(request):
"""Create new payment"""
if request.method == 'POST':
form = PaymentForm(request.POST)
if form.is_valid():
payment = form.save(commit=False)
payment.status = 'completed' # Auto-complete payment
payment.save()
messages.success(request, f'Payment of ${payment.amount} recorded successfully!')
return redirect('payment_list')
else:
form = PaymentForm()
return render(request, 'receiptsiclife/payment_form.html', {'form': form, 'title': 'Record New Payment'}) "
" SETTINGS.PY
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-j^%lil+8pmkkqmzd549p$@a96ro-#u(w&qi+vf-vt@ifm^v+2n'
# SECURITY WARNING: don't run with debug turned on in production!
#2ND CHANGES MADE
DEBUG = config('DEBUG', default=True, cast=bool)
#Changes made
#DEBUG = True
ALLOWED_HOSTS = ['localhost', '127.0.0.1']
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'receiptsiclife',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'receiptsystemsiclife.urls' "
" URLS.PY
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('receiptsiclife.urls')),
] "
" " BASE.HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}ReceiptSicLife{% endblock %}</title>
<!-- Bootstrap CSS -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
<!-- Custom CSS -->
{% load static %}
<link rel="stylesheet" href="{% static 'css/style.css' %}">
{% block extra_css %}{% endblock %}
</head>
<body>
<!-- Navigation Bar -->
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container">
<a class="navbar-brand" href="{% url 'home' %}">ReceiptSicLife</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="{% url 'home' %}">Dashboard</a>
</li>
<!-- Add more navigation items as needed -->
</ul>
<ul class="navbar-nav">
{% if user.is_authenticated %}
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown">
{{ user.username }}
</a>
<ul class="dropdown-menu"> "
"URLS.PY This is my URLS.py
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)"