We wcześniejszych wpisach opisałem zarządzanie użytkownikami w >>aplikacji<< tzn. nowy użytkownik może się zarejestrować – utworzyć konto w witrynie, użytkownik zarejestrowany może się zalogować, wylogować lub zmienić swoje hasło.
Następnie opiszę główną funkcjonalność witryny tzn. ewidencję aut i napraw. W tym celu w pliku urls.py projektu załączę mapowanie adresów związanych z aplikacją cars. Po zmianach plik urls.py projektu będzie wyglądał następująco:
from django.contrib import admin
from django.urls import path, include
from users import views as users_views
from django.contrib.auth import views as auth_views
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('cars.urls')),
path('register-user/', users_views.RegisterUser.as_view(
template_name='users/register-user.html'), name='register_user'),
path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name='logout'),
path('change-password/', users_views.ChangePassword.as_view(
template_name='users/change-password.html'), name='change_password'),
]
Można zauważyć, że mapowanie adresów na odpowiednie widoki uwzględnia też plik urls.py utworzony w aplikacji cars. Plik urls.py z aplikacji cars wyglada następująco:
from django.urls import path
from .views import (
CarsListView,
AddCarView,
RepairsListView,
UpdateCarView,
DeleteCarView,
AddRepairView
)
urlpatterns = [
path('', CarsListView.as_view(), name='cars'),
path('add-car/', AddCarView.as_view(), name='add_car'),
path('car/', RepairsListView.as_view(), name='car_detail'),
path('car/<int:pk>/update/', UpdateCarView.as_view(), name='update_car'),
path('car/<int:pk>/delete/', DeleteCarView.as_view(), name='delete_car'),
path('car/<int:pk>/new-repair/', AddRepairView.as_view(), name='add_repair'),
]
Główny widok definiowany w klasie CarListView wyświetla wszystkie auta użytkownika.
Należy pamiętać o dopisaniu aplikacji w pliku settings.py projektu w liście INSTALLED_APPS np. dla aplikacji cars będzie to element: ‘cars.apps.CarsConfig’.
W aplikacji users korzystałem z preinstalowanego modelu użytkownika. W aplikacji cars należy stworzyć modele – obiekty mapujące tabele bazy danych. Modele te będą definiować: pojazd – model Car i naprawę – model Repair. Kod pliku models.py aplikacji cars wygląda następująco:
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
from django.core.validators import MaxValueValidator, MinValueValidator
class Car(models.Model):
make = models.CharField(max_length=10)
model = models.CharField(max_length=10)
vrn = models.CharField(max_length=10)
year = models.IntegerField(default=timezone.now().year,
validators=[MinValueValidator(timezone.now().year - 100),
MaxValueValidator(timezone.now().year)])
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return f'{self.make} {self.model}'
class Repair(models.Model):
date = models.DateField(default=timezone.now)
description = models.TextField()
car = models.ForeignKey(Car, on_delete=models.CASCADE)
def __str__(self):
lead = self.description[:10] + '...'
return lead
Model Car zawiera atrybuty make, model, vrn, year i user opisujące markę pojazdu, model, nr rejestracyjny pojazdu i rok produkcji, a także klucz obcy, zawierający obiekt użytkownika, który utworzył wpis o pojeździe. Pole year posiada walidatory, uniemożliwiające wpisanie auta o roku produkcji o 100 lat starszym od bieżącej daty i nowszym niż bieżący rok. Opcja on_delete atrybutu user ma wartość domyślną CASCADE tzn. usunięcie użytkownika, który wprowadzić powoduje także usunięcie wszystkich wprowadzonych przez niego aut.
Model Repair zawiera atrybuty date – data naprawy, description – szczegóły naprawy oraz car, będący kluczem obcym – jakiego auta dotyczy dana naprawa. Metoda __str__() wyświetla nagłówek będący początkiem opisu naprawy (10 początkowych znaków).
Aby móc dokonywać edycji wpisów obu modeli z poziomu panelu administracyjnego trzeba dopisać oba modele do pliku admin.py aplikacji cars tzn.
from django.contrib import admin
from .models import Car, Repair
admin.site.register(Car)
admin.site.register(Repair)
W następnej części opiszę widoki definiujące poszczególne funkcjonalności tzn. wyświetlanie aut należących do użytkownika, dodawanie napraw, a także wyszukiwanie aut za pomocą pola wyszukiwania na stronie.
— c. d. n. —
