Отображение fieldsets и tabularinline в django
#admin.py
from .models import *
from django.contrib import admin
@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
list_filter = ('status', 'due_back', 'book')
fieldsets = (
(None, {
'fields': ('book','imprint', 'id')
}),
('Availability', {
'fields': ('status', 'due_back')
}),
)
class BooksInstanceInline(admin.TabularInline):
model = BookInstance
fk_name = 'book'
class BooksInline(admin.TabularInline):
model = Book
fk_name = 'author'
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'display_genre')
inlines = [BooksInstanceInline]
@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')
fields = ['first_name', 'last_name', ('date_of_birth', 'date_of_death')]
inlines = [BooksInline]
@admin.register(Genre)
class GenreAdmin(admin.ModelAdmin):
pass
#models.py
from django.urls import reverse
from django.db import models
import uuid
class Genre(models.Model):
"""
Model representing a book genre (e.g. Science Fiction, Non Fiction).
"""
name = models.CharField(max_length=200,help_text='Enter a book genre (e.g. Science Fiction, French Poetry etc.)')
def __str__(self):
return self.name
class Author(models.Model):
"""
Model representing an author
"""
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
date_of_birth = models.DateField(null=True, blank=True)
date_of_death = models.DateField('Died', null=True, blank=True)
def get_absolute_url(self):
return reverse('author-detail', args[str(self.id)])
def __str__(self):
return f'{self.last_name} {self.first_name}'
class Book(models.Model):
"""
Model representing a book (but not a specific copy of a book).
"""
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True)
summary = models.TextField(max_length=1000, help_text='Enter a brief description of the book')
isbn = models.CharField('ISBN',max_length=13,help_text='13 Character <a href="https://www.isbn-international.org/content/what-isbn">ISBN number</a>')
genre = models.ManyToManyField(Genre, help_text='Select a genre for this book')
LANGUAGE = (
('ru', 'Russian'),
('en', 'English'),
('ger', 'German'),
('fr', 'French'),
)
lang = models.CharField('Language',max_length=3,choices=LANGUAGE, default='ru', help_text='Language of book')
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('book-detail', args=[str(self.id)])
def display_genre(self):
"""
Creates a string for the Genre. This is required to display genre in Admin.
"""
return ', '.join([ genre.name for genre in self.genre.all()[:3] ])
display_genre.short_description = 'Genre'
class BookInstance(models.Model):
"""
Model representing a specific copy of a book (i.e. that can be borrowed from the library).
"""
id = models.UUIDField(primary_key=True,default=uuid.uuid4,help_text='Unique ID for this particular book across whole library')
book = models.ForeignKey('Book', on_delete=models.SET_NULL,null=True)
imprint = models.CharField(max_length=200)
due_back = models.DateField(null=True,blank=True)
LOAN_STATUS = (
('m', 'Maintenance'),
('o', 'On loan'),
('a', 'Avaible'),
('r', 'reserved'),
)
status = models.CharField(max_length=1, choices=LOAN_STATUS,blank=True, default='m',help_text='Book avaibility')
class Meta:
ordering = ["due_back"]
def __str__(self):
return f'{self.id} {self.book.title}'
def title(self):
return self.book.title
Django ошибок не выдает, по его мнению все в порядке. Но. Ох уж это "Но". Шел я по шпаргалке mdn по django и натолкнулся на не рабочий код. Проблема первая случилась с Fieldsets. они просто не работают(сейчас для затычки вставил list_display, без него он вместо сета выдает то что прописано в str). в чем проблема я не вижу. Проблема вторая - tabularinline. По задумке мдн на страницах автора должны отобразиться его книги, а на странице книги должны отобразиться экземпляры этой книги. Однако и там и тут почему-то после связанных объектов(и даже если их нет) отображаются три не созданных объекта. И так вопрос. Что это и как с этим бороться?