1. Utworzenie nowej aplikacji core
cd /opt/wsi_django
source venv/bin/activatepython manage.py startapp core2. Rejestracja aplikacji w settings.py
nano wsi_django/settings.pyDodaj '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.pyfrom 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 migrateRejestracja modelu w panelu administracyjnym
1. Rejestracja w core/admin.py
nano core/admin.pyfrom 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',)