1. Utworzenie nowej aplikacji core

cd /opt/wsi_django
source venv/bin/activate
python manage.py startapp core

2. Rejestracja aplikacji w settings.py

nano wsi_django/settings.py

Dodaj 'core', do listy INSTALLED_APPS:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contenttypes',
    'django.sessions',
    'django.messages',
    'django.staticfiles',
    'core',  # nasza nowa aplikacja
]

3. Definicja modeli w core/models.py

nano core/models.py
from django.db import models

class SchoolYear(models.Model):
    name = models.CharField("Rok szkolny", max_length=9, unique=True, help_text="Format: RRRR/RRRR (np. 2025/2026)")
    is_active = models.BooleanField("Czy aktualny/domyślny", default=False)

    class Meta:
        verbose_name = "Rok szkolny"
        verbose_name_plural = "Lata szkolne"
        ordering = ['-name']

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        # Jeśli ten rok jest zapisywany jako aktywny, usuwamy flagę aktywności z pozostałych
        if self.is_active:
            SchoolYear.objects.exclude(pk=self.pk).update(is_active=False)
        super().save(*args, **kwargs)


class Semester(models.Model):
    SEMESTER_CHOICES = [
        (1, 'Semestr I'),
        (2, 'Semestr II'),
    ]
    school_year = models.ForeignKey(SchoolYear, on_delete=models.CASCADE, related_name='semesters', verbose_name="Rok szkolny")
    number = models.IntegerField("Numer semestru", choices=SEMESTER_CHOICES)
    is_active = models.BooleanField("Czy aktualny/domyślny", default=False)

    class Meta:
        verbose_name = "Semestr"
        verbose_name_plural = "Semestry"
        unique_together = ('school_year', 'number')
        ordering = ['school_year', 'number']

    def __str__(self):
        return f"{self.school_year} - Semestr {self.number}"

    def save(self, *args, **kwargs):
        # Jeśli ten semestr jest zapisywany jako aktywny, usuwamy flagę z pozostałych semestrów w tym samym roku
        if self.is_active:
            Semester.objects.filter(school_year=self.school_year).exclude(pk=self.pk).update(is_active=False)
        super().save(*args, **kwargs)

4. Wykonanie migracji

python manage.py makemigrations core
python manage.py migrate

Rejestracja modelu w panelu administracyjnym

1. Rejestracja w core/admin.py

nano core/admin.py
from django.contrib import admin
from .models import SchoolYear, Semester

class SemesterInline(admin.TabularInline):
    model = Semester
    extra = 2  # Od razu wyświetli pola dla 2 semestrów przy dodawaniu roku
    max_num = 2

@admin.register(SchoolYear)
class SchoolYearAdmin(admin.ModelAdmin):
    list_display = ('name', 'is_active')
    list_editable = ('is_active',)
    inlines = [SemesterInline]

@admin.register(Semester)
class SemesterAdmin(admin.ModelAdmin):
    list_display = ('school_year', 'number', 'is_active')
    list_filter = ('school_year',)
    list_editable = ('is_active',)

 

 

 

Spis treści: