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">
            &copy; {% 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.py
from 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.py

Upewnij się, że na końcu pliku masz ustawione:

LOGIN_URL = 'login'
LOGIN_REDIRECT_URL = 'dashboard'
LOGOUT_REDIRECT_URL = 'login'

 

 

 

 

 

 

 

Spis treści: