📌 Step 1: Project Setup
# Virtual environment তৈরি করো
python3 -m venv venv
# Activate করো linux
source venv/bin/activate
# Django install করো
pip install django
# Project তৈরি করো
django-admin startproject school_project
cd school_project
# App তৈরি করো
python manage.py startapp students
📌 Step 2: App Registration
school_project/settings.py খোলো এবং INSTALLED_APPS এ add করো:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'students', # এটা add করো
]
📌 Step 3: Student Model তৈরি
students/models.py:
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=100)
roll = models.IntegerField(unique=True)
email = models.EmailField()
phone = models.CharField(max_length=15)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.name} - Roll: {self.roll}"
class Meta:
ordering = ['roll']
Migration করো:
python manage.py makemigrations
python manage.py migrate
📌 Step 4: Admin Panel Setup
students/admin.py:
from django.contrib import admin
from .models import Student
@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):
list_display = ['name', 'roll', 'email', 'phone', 'created_at']
search_fields = ['name', 'roll', 'email']
Superuser তৈরি করো:
python manage.py createsuperuser
# Username, email, password দাও
📌 Step 5: Views তৈরি (CRUD Operations)
students/views.py:
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from .models import Student
# List all students
def student_list(request):
students = Student.objects.all()
return render(request, 'students/student_list.html', {'students': students})
# Create new student
def student_create(request):
if request.method == 'POST':
try:
name = request.POST.get('name')
roll = request.POST.get('roll')
email = request.POST.get('email')
phone = request.POST.get('phone')
Student.objects.create(
name=name,
roll=roll,
email=email,
phone=phone
)
messages.success(request, 'Student added successfully!')
return redirect('student_list')
except Exception as e:
messages.error(request, f'Error: {str(e)}')
return render(request, 'students/student_form.html')
# Update student
def student_update(request, pk):
student = get_object_or_404(Student, pk=pk)
if request.method == 'POST':
try:
student.name = request.POST.get('name')
student.roll = request.POST.get('roll')
student.email = request.POST.get('email')
student.phone = request.POST.get('phone')
student.save()
messages.success(request, 'Student updated successfully!')
return redirect('student_list')
except Exception as e:
messages.error(request, f'Error: {str(e)}')
return render(request, 'students/student_form.html', {'student': student})
# Delete student
def student_delete(request, pk):
student = get_object_or_404(Student, pk=pk)
if request.method == 'POST':
try:
student.delete()
messages.success(request, 'Student deleted successfully!')
except Exception as e:
messages.error(request, f'Error: {str(e)}')
return redirect('student_list')
return render(request, 'students/student_confirm_delete.html', {'student': student})
# Error test করার জন্য
def test_error(request):
# ইচ্ছা করে error তৈরি করছি
result = 10 / 0 # ZeroDivisionError
return render(request, 'students/test.html')
📌 Step 6: URLs Setup
students/urls.py (নতুন file তৈরি করো):
from django.urls import path
from . import views
urlpatterns = [
path('', views.student_list, name='student_list'),
path('create/', views.student_create, name='student_create'),
path('update/<int:pk>/', views.student_update, name='student_update'),
path('delete/<int:pk>/', views.student_delete, name='student_delete'),
path('test-error/', views.test_error, name='test_error'),
]
school_project/urls.py update করো:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('students/', include('students.urls')),
]
📌 Step 7: Templates তৈরি
Directory structure তৈরি করো:
students/
templates/
students/
base.html
student_list.html
student_form.html
student_confirm_delete.html
students/templates/students/base.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Student Management</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: Arial, sans-serif; background: #f5f5f5; padding: 20px; }
.container { max-width: 1000px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
h1 { color: #333; margin-bottom: 20px; }
.btn { padding: 10px 20px; background: #007bff; color: white; text-decoration: none; border-radius: 5px; display: inline-block; margin: 5px; border: none; cursor: pointer; }
.btn:hover { background: #0056b3; }
.btn-danger { background: #dc3545; }
.btn-danger:hover { background: #c82333; }
.btn-success { background: #28a745; }
.btn-success:hover { background: #218838; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { padding: 12px; text-align: left; border-bottom: 1px solid #ddd; }
th { background: #007bff; color: white; }
tr:hover { background: #f1f1f1; }
.messages { margin: 20px 0; }
.alert { padding: 15px; border-radius: 5px; margin-bottom: 10px; }
.alert-success { background: #d4edda; color: #155724; }
.alert-error { background: #f8d7da; color: #721c24; }
form { margin-top: 20px; }
.form-group { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; font-weight: bold; }
input { width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 5px; }
</style>
</head>
<body>
<div class="container">
{% if messages %}
<div class="messages">
{% for message in messages %}
<div class="alert alert-{{ message.tags }}">
{{ message }}
</div>
{% endfor %}
</div>
{% endif %}
{% block content %}
{% endblock %}
</div>
</body>
</html>
students/templates/students/student_list.html:
{% extends 'students/base.html' %}
{% block content %}
<h1>📚 Student List</h1>
<a href="{% url 'student_create' %}" class="btn btn-success">➕ Add New Student</a>
<a href="{% url 'test_error' %}" class="btn btn-danger">🔥 Test Error (Sentry)</a>
<table>
<thead>
<tr>
<th>Roll</th>
<th>Name</th>
<th>Email</th>
<th>Phone</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{% for student in students %}
<tr>
<td>{{ student.roll }}</td>
<td>{{ student.name }}</td>
<td>{{ student.email }}</td>
<td>{{ student.phone }}</td>
<td>
<a href="{% url 'student_update' student.pk %}" class="btn">✏️ Edit</a>
<a href="{% url 'student_delete' student.pk %}" class="btn btn-danger">🗑️ Delete</a>
</td>
</tr>
{% empty %}
<tr>
<td colspan="5" style="text-align: center;">No students found. Add one!</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
students/templates/students/student_form.html:
{% extends 'students/base.html' %}
{% block content %}
<h1>{% if student %}✏️ Edit Student{% else %}➕ Add New Student{% endif %}</h1>
<form method="POST">
{% csrf_token %}
<div class="form-group">
<label>Name:</label>
<input type="text" name="name" value="{{ student.name }}" required>
</div>
<div class="form-group">
<label>Roll Number:</label>
<input type="number" name="roll" value="{{ student.roll }}" required>
</div>
<div class="form-group">
<label>Email:</label>
<input type="email" name="email" value="{{ student.email }}" required>
</div>
<div class="form-group">
<label>Phone:</label>
<input type="text" name="phone" value="{{ student.phone }}" required>
</div>
<button type="submit" class="btn btn-success">💾 Save</button>
<a href="{% url 'student_list' %}" class="btn">❌ Cancel</a>
</form>
{% endblock %}
students/templates/students/student_confirm_delete.html:
{% extends 'students/base.html' %}
{% block content %}
<h1>🗑️ Delete Student</h1>
<p>Are you sure you want to delete <strong>{{ student.name }}</strong> (Roll: {{ student.roll }})?</p>
<form method="POST">
{% csrf_token %}
<button type="submit" class="btn btn-danger">✅ Yes, Delete</button>
<a href="{% url 'student_list' %}" class="btn">❌ Cancel</a>
</form>
{% endblock %}
📌 Step 8: Server Run করো এবং Test করো
python manage.py runserver
এখন browser এ যাও: http://127.0.0.1:8000/students/
কিছু student add করো, edit করো, delete করো – সব test করো!
🎯 Step 9: Sentry Account খোলা এবং Setup
1️⃣ Sentry Account তৈরি
- যাও: https://sentry.io/signup/
- Sign up করো (GitHub/Google দিয়েও করতে পারবে)
- Free plan select করো
2️⃣ Project তৈরি
- Dashboard এ “Create Project” click করো
- Platform select করো: Django
- Project এর নাম দাও:
school-project - Click “Create Project”
3️⃣ DSN Copy করো
Setup page এ একটা DSN দেখবে যেটা এরকম দেখতে:
https://abc123xyz@o123456.ingest.sentry.io/7891011
এটা copy করে রাখো!
📌 Step 10: Sentry Setup in Django
# Sentry SDK install করো
pip install sentry-sdk
school_project/settings.py এর একদম শেষে add করো:
# Sentry Configuration
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration
sentry_sdk.init(
dsn="YOUR_SENTRY_DSN_HERE", # এখানে তোমার DSN paste করো
integrations=[
DjangoIntegration(),
],
traces_sample_rate=1.0, # 100% transactions track করবে
send_default_pii=True, # User info send করবে
environment="development", # Environment name
)
📌 Step 11: Error Test করো!
- Server run করো:
python manage.py runserver
- Browser এ যাও:
http://127.0.0.1:8000/students/ - “Test Error” button এ click করো
- Sentry dashboard এ যাও: https://sentry.io/
- তোমার project এ click করো
- Issues tab এ error দেখতে পাবে! 🎉
🎁 Bonus: Different Types of Errors Test
students/views.py তে আরো error test functions add করো:
def test_division_error(request):
# Division by zero
result = 10 / 0
return render(request, 'test.html')
def test_database_error(request):
# Invalid database query
Student.objects.get(roll=99999) # Non-existent roll
return render(request, 'test.html')
def test_custom_error(request):
# Custom exception
raise ValueError("This is a custom test error!")
URLs add করো:
path('test-division/', views.test_division_error, name='test_division'),
path('test-database/', views.test_database_error, name='test_database'),
path('test-custom/', views.test_custom_error, name='test_custom'),
📊 Sentry Dashboard এ কী কী দেখবে:
- Error Type: কোন ধরনের error (ZeroDivisionError, ValueError etc.)
- Stack Trace: কোন file এর কোন line এ error হয়েছে
- Request Info: URL, Method, Headers
- User Info: কোন user error করেছে
- Browser Info: Chrome, Firefox etc.
- Frequency: কতবার হয়েছে
✅ Final Checklist:
- [ ] Project setup হয়েছে
- [ ] Student CRUD কাজ করছে
- [ ] Sentry account খোলা হয়েছে
- [ ] Sentry DSN configure করা হয়েছে
- [ ] Error test করা হয়েছে
- [ ] Sentry dashboard এ error দেখা যাচ্ছে