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
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
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)
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)
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)
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)
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.