- Python 66%
- HTML 34%
| config | ||
| news | ||
| db.sqlite3 | ||
| manage.py | ||
| README.md | ||
Klasyczny przykład aplikacji Django - Aktualności (News)
Projekt przedstawia klasyczną architekturę i zastosowanie frameworka Django. Składa się z warstwy backendowej, zintegrowanego modelu bazy danych (SQLite) oraz warstwy prezentacji opartej na szablonach Django (Django Templates). Myślę, ze całkiem fajny punkt wyjścia do nauki spraw związanych z backendem
Funkcjonalności
- Wyświetlanie listy najnowszych aktualności na stronie głównej.
- Podgląd szczegółów wybranej wiadomości.
- Dynamiczne zarządzanie treścią (CMS) z poziomu wbudowanego Panelu Administratora (dodawanie, edycja, ukrywanie oraz usuwanie aktualności).
- Ochrona przed ukazywaniem treści oznaczonych jako nieaktywne (
is_active=False). - Wbudowany system szablonów bazujący na mechanizmie dziedziczenia (
base.html).
Struktura Projektu i Dobre Praktyki
W projekcie zastosowano bardziej transparentną strukturę katalogów (często pomijaną przez automatyczne generatory w środowiskach IDE, takich jak PyCharm).
Podział na Projekt (config) i Aplikację (news)
Zamiast tworzyć folder konfiguracyjny o takiej samej nazwie jak główny folder projektu (co prowadzi do zjawiska tzw. double-nested folders), zastosowano wyraźny podział na role:
- Katalog
config: Pełni rolę centrum sterowania dla całego systemu. Zawiera wyłącznie globalne ustawienia (settings.py), główny routing adresów URL (urls.py) oraz konfigurację serwera (WSGI/ASGI). Nie ma tutaj żadnej logiki biznesowej. - Katalog
news: Jest to tzw. Aplikacja Django. Zgodnie z filozofią frameworka, Django jest zbudowane modułowo – jeden system składa się z wielu, niezależnych aplikacji.newsodpowiada wyłącznie za domenę aktualności (modele, widoki, szablony). Gdyby projekt miał zostać rozbudowany o galerię zdjęć, utworzylibyśmy nową aplikację obok katalogunews, a wszystko wciąż łączyłby jeden nadrzędnyconfig. Jak się albo powraca do projektu po dłuzszym czasie albo po kimś robi, to nazywanie tak samo głównego folderu projektu i folderu projektu/konfiguracji - to zawsze miesza
Rola pliku apps.py
Wewnątrz aplikacji news znajduje się automatycznie wygenerowany plik apps.py. W nowoczesnym ekosystemie Django plik ten służy do "przedstawienia się" aplikacji głównemu projektowi. W nowszych wersjach jest to mile widziane. Zwłaszcza, ze później bywa łatwiej.
Zamiast dodawać aplikację do INSTALLED_APPS (w settings.py) jako zwykły string 'news', dobrą praktyką jest wskazanie klasy konfiguracyjnej (np. 'news.apps.NewsConfig'). Pozwala to na:
- Nadawanie aplikacji przyjaznych nazw (np.
verbose_name = "Zarządzanie Aktualnościami"), które potem ładnie wyświetlają się w Panelu Administratora. - Uruchamianie kodu w momencie startu aplikacji (w metodzie
ready()), co jest niezbędne np. do rejestrowania sygnałów (Signals) w Django.
Architektura i zastosowane rozwiązania
-
Wzorzec MVT (Model-View-Template)
- Model (
news/models.py): Reprezentuje tabelęNewsw bazie danych, zawierając pola na tytuł, treść, status (aktywna/nieaktywna) oraz znaczniki czasowe. - Widok (
news/views.py): Wykorzystuje klasowe widoki generyczne Django (Class-Based Views).ListViewsłuży do prezentacji wszystkich aktualności (z sortowaniem malejącym), aDetailViewdo wyświetlenia pojedynczego wpisu. - Szablony (
news/templates/): Warstwa wizualna. Korzysta z dziedziczenia z szablonubase.html, co redukuje duplikację kodu HTML (DRY - Don't Repeat Yourself).
- Model (
-
Panel Administratora (
news/admin.py)- Panel Django automatycznie generuje interfejs do operacji CRUD (Create, Read, Update, Delete) na obiekcie
News. - Zastosowano zaawansowane konfiguracje (np.
list_display,list_filter,search_fields), które ułatwiają zarządzanie masowymi wpisami.
- Panel Django automatycznie generuje interfejs do operacji CRUD (Create, Read, Update, Delete) na obiekcie
Instrukcja uruchomienia (Lokalnie)
Aby przetestować projekt w lokalnym środowisku, upewnij się, że posiadasz zainstalowanego Pythona (wersja 3.8+).
1. Klonowanie i przygotowanie środowiska
Stwórz wirtualne środowisko, aby odizolować pakiety Pythona:
python3 -m venv venv
Aktywuj środowisko:
- Na systemach Linux/macOS:
source venv/bin/activate - Na systemach Windows:
venv\Scripts\activate
Zainstaluj zależności (w tym przypadku bazowy Django):
pip install django
2. Konfiguracja bazy danych
Utwórz i zastosuj migracje bazy danych, aby Django stworzył niezbędne tabele w pliku SQLite:
python manage.py makemigrations
python manage.py migrate
3. Tworzenie konta administratora
Aby móc zarządzać treścią dynamicznie, konieczne jest posiadanie konta typu "superuser". (Jeżeli zostało utworzone wcześniej, np. login: admin, hasło: admin, możesz ten krok pominąć).
python manage.py createsuperuser
Postępuj zgodnie z instrukcjami na ekranie, by ustawić nazwę użytkownika oraz hasło.
4. Uruchomienie serwera aplikacji
Uruchom wbudowany serwer deweloperski:
python manage.py runserver
Aplikacja będzie dostępna w przeglądarce pod adresem:
- Strona główna (Frontend): http://127.0.0.1:8000/
- Panel zarządzania (Backend CMS): http://127.0.0.1:8000/admin/
Zaloguj się do panelu admina używając konta z punktu 3 i dodaj kilka przykładowych "Aktualności", upewniając się, że zaznaczono opcję Czy aktywne?. Po ich dodaniu będą one natychmiast widoczne na stronie głównej.
Instrukcja rozbudowy (Dalsze kroki)
Aplikacja ma charakter bazowy. Oto sugestie dalszego rozwoju, które mogą podnieść wartość edukacyjną projektu:
-
System Komentarzy:
- W pliku
news/models.pydodaj nowy modelCommentzawierający klucz obcy (Foreign Key) wskazujący na obiektNews. - Stwórz w
news/forms.py(nowy plik) klasęCommentFormdziedziczącą zforms.ModelForm. - Zaktualizuj widok szczegółów
NewsDetailView, tak aby pobierał i obsługiwał przychodzący formularz metodą POST.
- W pliku
-
Obsługa obrazków do artykułu:
- Dodaj pole
image = models.ImageField(upload_to='news_images/', null=True, blank=True)w modeluNews. - Zainstaluj bibliotekę
Pillow(pip install Pillow), niezbędną do operacji na plikach graficznych w Django. - Zaktualizuj plik
settings.py, dodając konfiguracjeMEDIA_URLorazMEDIA_ROOT, i dodaj te ścieżki dourls.py.
- Dodaj pole
-
Autoryzacja Użytkowników Frontendowych:
- Skorzystaj z wbudowanych widoków logowania (
django.contrib.auth.views.LoginView) i zarejestruj je wurls.py. - Zmodyfikuj szablon
base.html, by ukazywał sekcję "Zaloguj się" lub "Witaj, [Nazwa Użytkownika]". - Użyj dekoratorów
@login_required(dla widoków funkcyjnych) lub klasLoginRequiredMixin(dla widoków klasowych), by ograniczyć dostęp do pewnych widoków.
- Skorzystaj z wbudowanych widoków logowania (
-
Kategoryzacja Aktualności:
- Dodaj nowy model
Categoryi przypisz mu relację One-to-Many z modelemNews. - Stwórz mechanizm filtrowania wyników w
NewsListViewza pomocą nadpisania metodyget_queryset()bazującej na wybranej z URL kategorii.
- Dodaj nowy model