Po zalogowaniu pulpit główny aplikacji
Krok 1: Utworzenie szablonu pulpitu (dashboard.html)
Główny szablon strony (base.html)
nano templates/base.html{# Strona główna po zalogowaniu użytkownika. Zawiera nagłówek, pasek użytkownika i kontekst szkolny, miejsce na karty aplikacji oraz stopkę. #}
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}WSI{% endblock %}</title>
<script src="https://cdn.tailwindcss.com"></script>
{% block extra_head %}{% endblock %}
</head>
<body class="bg-gray-50 flex flex-col min-h-screen font-sans">
{% if user.is_authenticated %}
<header class="bg-white shadow-sm border-b border-gray-100">
<div class="container mx-auto px-4 py-4 flex justify-between items-center">
<div class="flex items-center space-x-3">
<svg class="h-8 w-8 text-blue-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253" />
</svg>
<div>
<span class="font-bold text-lg text-gray-900 block leading-tight">Szkoła Podstawowa nr 1</span>
<span class="text-xs font-semibold text-blue-600 uppercase tracking-wider">Wewnątrzszkolny System Informatyczny</span>
</div>
</div>
<nav class="flex items-center space-x-6 text-base font-medium">
<a href="{% url 'dashboard' %}" class="text-blue-600 font-semibold">Strona główna</a>
{% if request.user.is_superuser %}
<a href="/admin/" target="_blank" class="text-gray-600 hover:text-blue-600 transition-colors">Panel admina</a>
{% endif %}
<form method="POST" action="{% url 'logout' %}" class="inline items-center">
{% csrf_token %}
<button type="submit" class="bg-gradient-to-br from-red-600 to-red-700 hover:from-red-700 hover:to-red-800 text-white transition-all duration-300 ease-in-out shadow-[0_2px_4px_rgba(220,38,38,0.2)] hover:shadow-[0_4px_8px_rgba(220,38,38,0.3)] hover:-translate-y-0.5 relative overflow-hidden flex items-center h-12 py-3 px-6 rounded-lg font-medium cursor-pointer">
Wyloguj
</button>
</form>
</nav>
</div>
</header>
{% endif %}
{# Blok informacyjny o zalogowanym użytkowniku i kontekście szkolnym (rok, semestr). #}
{% block context_bar %}
{% endblock %}
{# Miejsce na unikalną treść danej podstrony #}
{% block content %}
{% endblock %}
<footer class="bg-white border-t border-gray-100 py-4 mt-auto">
<div class="container mx-auto px-4 text-center text-xs text-gray-500">
© {% now "Y" %} Wewnątrzszkolny System Informatyczny. Wszelkie prawa zastrzeżone.
</div>
</footer>
</body>
</html>
Środek szablonu - po zalogowaniu - strona główna
nano templates/dashboard.html{% extends 'base.html' %}
{% block title %}WSI - Pulpit{% endblock %}
{% block context_bar %}
{% if user.is_authenticated %}
<div class="!bg-gradient-to-r !from-[#1e293b] !via-[#334155] !to-[#dc2626] text-white shadow-md py-8">
<div class="container mx-auto px-4 py-3 flex flex-col sm:flex-row justify-between items-center text-sm">
<div class="flex flex-col">
<div class="font-light text-blue-200 my-3">Zalogowano jako:</div>
<h2></h2>
<h3 class="text-3xl font-semibold text-white leading-tight">
{% if request.user.first_name or request.user.last_name %}
{{ request.user.last_name }} {{ request.user.first_name }}
{% else %}
{{ request.user.username }}
{% endif %}
{% if request.user.first_name or request.user.last_name %}
{{ request.user.last_name }} {{ request.user.first_name }}
{% else %}
{{ request.user.username }}
{% endif %}
</h3>
<div class="text-xs ">
{% if request.user.is_superuser %}
Administrator
{% else %}
{% for group in request.user.groups.all %}
{{ group.name }}{% if not forloop.last %}, {% endif %}
{% empty %}
Nauczyciel {# Domyślna rola, jeśli zapomnisz przypisać grupę #}
{% endfor %}
{% endif %}
</div>
</div>
<div class="mt-2 sm:mt-0 flex items-center space-x-2">
<span class="text-blue-200 text-xs">Kontekst pracy:</span>
<select class="bg-blue-800 text-white text-xs rounded border border-blue-700 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-white">
<option value="2025/2026-2" selected>Rok 2025/2026 - Semestr 2 (Aktualny)</option>
</select>
</div>
</div>
</div>
{% endif %}
{% endblock %}
{% block content %}
<main class="flex-grow max-w-7xl w-full mx-auto px-4 py-8">
<div class="border-2 border-dashed border-gray-300 rounded-xl p-12 text-center text-gray-400">
<p class="text-lg font-medium">Miejsce na karty aplikacji (moduły systemu)</p>
<p class="text-sm mt-1">Moduły zostaną dodane w kolejnych krokach.</p>
</div>
</main>
{% endblock %}Krok 2: Konfiguracja routingu i przekierowania
nano wsi_django/urls.pyfrom django.contrib import admin
from django.urls import path
from django.contrib.auth import views as auth_views
from django.views.generic import TemplateView
from django.contrib.auth.decorators import login_required
urlpatterns = [
path('admin/', admin.site.class_view if hasattr(admin, 'class_view') else admin.site.urls),
path('login/', auth_views.LoginView.as_view(template_name='index.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
# Po zalogowaniu strona główna ('/') wyświetli dashboard
path('', login_required(TemplateView.as_view(template_name='dashboard.html')), name='dashboard'),
]Krok 3: Aktualizacja przekierowania w settings.py
nano wsi_django/settings.pyUpewnij się, że na końcu pliku masz ustawione:
LOGIN_URL = 'login'
LOGIN_REDIRECT_URL = 'dashboard'
LOGOUT_REDIRECT_URL = 'login'