Django – #8 – Pierwsza aplikacja – Modyfikacja widoków w panelu administratora

Wprowadzenie.

W #4 wpisie przedstawiłem jak obsługiwać wbudowany panel administratora. Często zdarza się, że wprowadzanie danych w domyślnym widoku w przypadku, jeżeli występuje realcja ForeignKey między tabelami może być uciążliwe, dlatego w tym wpisie przedstawię w jaki sposób zmodyfikować widok panelu administratora dla wprowadzania danych.

Zakres artykułu.

  • Tworzenie aplikacji Django – Modyfikacja widoków w panelu administratora 

Tworzenie aplikacji Django – Modyfikacja widoków w panelu administratora 

W celu zademonstrowania modyfikacji widoków jesteśmy zmuszeni zmodyfikować nieco nasze modele. Wyobraźmy sobie przypadek, że teraz mamy zamiar dodawać kilka recenzji różnych osób. W tym celu zmodyfikujmy plik models.py w naszej aplikacji.   

from django.db import models

# Create your models here.

class MovieGenres(models.Model):
    genre = models.CharField(max_length=128)

    def __str__(self):
        return self.genre

class MovieActors(models.Model):
    first_name = models.CharField(max_length=64)
    last_name = models.CharField(max_length=64)
    age = models.IntegerField(default=0)

    def __str__(self):
        return self.first_name + " " + self.last_name

class WatchedMovies(models.Model):
    RATES = (
        ('1', 'Okropny'),
        ('2', 'Słaby'),
        ('3', 'Średni'),
        ('4', 'Dobry'),
        ('5', 'Znakomity'),
    )
    title = models.CharField(max_length=128)
    release_date = models.DateTimeField('data premiery')
    stars = models.ManyToManyField(MovieActors)
    genre = models.ForeignKey(MovieGenres, on_delete=models.CASCADE)
    rate = models.CharField(max_length=1, choices=RATES)
    
    def __str__(self):
        return self.title

class MovieReview(models.Model):
    review = models.TextField(blank=False)
    first_name = models.CharField(max_length=64)
    last_name = models.CharField(max_length=64)

    watchedMovies = models.ForeignKey(WatchedMovies, on_delete=models.CASCADE)

    def __str__(self):
        return self.review

Zmodyfikujmy plik admin.py w którym rejestrowaliśmy nasze modele. Na razie zarejestrujemy model po staremu.

from django.contrib import admin

# Register your models here.

from .models import MovieGenres, MovieActors, WatchedMovies, MovieReview

admin.site.register(MovieGenres)
admin.site.register(MovieActors)
admin.site.register(WatchedMovies)
admin.site.register(MovieReview)

Przeprowadźmy migrację bazy danych i uruchommy server.

Na stronie panelu powinniśmy zobaczyć następujący efekt.

Kolejne recenzje filmów będziemy dodawać w tabeli Movie reviews.

Panel z obejrzanymi filmami na chwilę obecną wygląda następująco.

Natomiast panel z recenzjami wygląda następująco.

W celu zmiany tych widoków musimy zmodyfikować tylko plik admin.py w następujący sposób.

from django.contrib import admin

# Register your models here.

from .models import MovieGenres, MovieActors, WatchedMovies, MovieReview

class MovieReviewInline(admin.TabularInline):
    model = MovieReview

class WatchedMoviesAdmin(admin.ModelAdmin):
    inlines = [ MovieReviewInline ]

admin.site.register(MovieGenres)
admin.site.register(MovieActors)
admin.site.register(WatchedMovies, WatchedMoviesAdmin)

W pliku dodaliśmy dwie klasy. Klasa dodawana do klasy głównej dziedziczy po klasie admin.TabularInline, natomiast klasa główna dziedziczy po klasie admin.ModelAdmin. W klasie wbudowywanej musimy do zmiannej model przypisać funkcję modelu, który chcemy, aby został wbudowany, natomiast w klasie głównej przypisujemy do zmiennej inlines w postaci listy kolejne klasy wbudowywane. 

Na stronie panelu powinniśmy teraz zobaczyć następujący efekt.

Jak możemy zauważyć, nie ma już tabeli z recenzjami. 

Panel z obejrzanymi filmami po modyfikacji wygląda następująco.

Domyślnie mamy ustawione 4 pola do kolejnych recenzji, jednakże jeżeli mamy taką potrzebę możemy nacisnąć przycisk Dodaj kolejne Movie review

Autor artykułu
Dominik Bednarski

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *