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.