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 e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *