Загрузка данных
Модели:
from django.db import models
from django.urls import reverse
from django.contrib.auth.models import User
from datetime import date
class Genre(models.Model):
name = models.CharField(max_length=200, help_text="Введите жанр книги", verbose_name="Жанр книги")
def __str__(self):
return self.name
class Language(models.Model):
name = models.CharField(max_length=20, help_text="Введите язык книги", verbose_name="Язык книги")
def __str__(self):
return self.name
class Author(models.Model):
first_name = models.CharField(max_length=100, help_text="Введите имя автора", verbose_name="Имя автора")
last_name = models.CharField(max_length=100, help_text="Введите фамилию автора", verbose_name="Фамилия автора")
date_of_birth = models.DateField(help_text="Введите дату рождения", verbose_name="Дата рождения", null=True, blank=True)
date_of_death = models.DateField(help_text="Введите дату смерти", verbose_name="Дата смерти", null=True, blank=True)
def __str__(self):
return self.last_name
def get_absolute_url(self):
return reverse('author-detail', args=[str(self.id)])
class Book(models.Model):
title = models.CharField(max_length=200, help_text="Введите название книги", verbose_name="Название книги")
genre = models.ForeignKey('Genre', on_delete=models.CASCADE, help_text="Выберите жанр книги", verbose_name="Жанр книги", null=True)
language = models.ForeignKey('Language', on_delete=models.CASCADE, help_text="Выберите язык книги", verbose_name="Язык книги", null=True)
author = models.ManyToManyField('Author', help_text="Выберите автора книги", verbose_name="Автор книги")
summary = models.TextField(max_length=1000, help_text="Введите краткое описание книги", verbose_name="Аннотация книги")
isbn = models.CharField(max_length=13, help_text="Должно содержать 13 символов", verbose_name="ISBN книги")
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('book-detail', args=[str(self.id)])
def display_author(self):
return ', '.join([author.last_name for author in self.author.all()])
display_author.short_description = 'Авторы'
class Status(models.Model):
name = models.CharField(max_length=20, help_text="Введите статус экземпляра книги", verbose_name="Статус экземпляра книги")
def __str__(self):
return self.name
class BookInstance(models.Model):
book = models.ForeignKey('Book', on_delete=models.CASCADE, null=True, verbose_name="Название книги")
inv_nom = models.CharField(max_length=20, null=True, help_text="Введите инвентарный номер экземпляра", verbose_name="Инвентарный номер")
imprint = models.CharField(max_length=200, help_text="Введите издательство и год выпуска", verbose_name="Издательство")
status = models.ForeignKey('Status', on_delete=models.CASCADE, null=True, help_text="Изменить состояние экземпляра", verbose_name="Статус экземпляра книги")
due_back = models.DateField(null=True, blank=True, help_text="Введите конец срока статуса", verbose_name="Дата окончания статуса")
borrower = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="Заказчик")
def __str__(self):
return '%s %s %s' % (self.inv_nom, self.book, self.status)
@property
def is_overdue(self):
if self.due_back and date.today() > self.due_back:
return True
return False
Админ
from django.contrib import admin
from .models import Author, Book, Genre, Language, Status, BookInstance
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')]
class BooksInstanceInline(admin.TabularInline):
model = BookInstance
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'genre', 'language', 'display_author')
list_filter = ('genre', 'author')
inlines = [BooksInstanceInline]
@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
list_display = ('book', 'status', 'borrower', 'due_back', 'inv_nom')
list_filter = ('book', 'status')
fieldsets = (
('Экземпляр книги', {'fields': ('book', 'imprint', 'inv_nom')}),
('Статус и окончание его действия', {'fields': ('status', 'due_back', 'borrower')}),
)
admin.site.register(Author, AuthorAdmin)
admin.site.register(Genre)
admin.site.register(Language)
admin.site.register(Status)
Фьювс
from django.shortcuts import render
from .models import Book, Author, BookInstance, Genre
from django.views import generic
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponseRedirect, HttpResponseNotFound
from .forms import AuthorsForm
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
def index(request):
num_books = Book.objects.all().count()
num_instances = BookInstance.objects.all().count()
num_instances_available = BookInstance.objects.filter(status__name='На складе').count()
num_authors = Author.objects.count()
num_visits = request.session.get('num_visits', 0)
request.session['num_visits'] = num_visits + 1
return render(request, 'index.html', context={
'num_books': num_books,
'num_instances': num_instances,
'num_instances_available': num_instances_available,
'num_authors': num_authors,
'num_visits': num_visits,
})
class BookListView(generic.ListView):
model = Book
paginate_by = 3
class BookDetailView(generic.DetailView):
model = Book
class AuthorListView(generic.ListView):
model = Author
paginate_by = 4
# --- Часть 1: Мои заказы ---
class LoanedBooksByUserListView(LoginRequiredMixin, generic.ListView):
model = BookInstance
template_name = 'catalog/bookinstance_list_borrowed_user.html'
paginate_by = 10
def get_queryset(self):
return BookInstance.objects.filter(borrower=self.request.user).filter(status__name='В заказе').order_by('due_back')
# --- Часть 2: Формы для Авторов ---
def authors_add(request):
author = Author.objects.all()
authorsform = AuthorsForm()
return render(request, "catalog/authors_add.html", {"form": authorsform, "author": author})
def create(request):
if request.method == "POST":
author = Author()
author.first_name = request.POST.get("first_name")
author.last_name = request.POST.get("last_name")
author.date_of_birth = request.POST.get("date_of_birth")
author.date_of_death = request.POST.get("date_of_death")
author.save()
return HttpResponseRedirect("/authors_add/")
def delete(request, id):
try:
author = Author.objects.get(id=id)
author.delete()
return HttpResponseRedirect("/authors_add")
except Author.DoesNotExist:
return HttpResponseNotFound("<h2>Автор не найден</h2>")
def edit(request, id):
author = Author.objects.get(id=id)
if request.method == "POST":
author.first_name = request.POST.get("first_name")
author.last_name = request.POST.get("last_name")
author.date_of_birth = request.POST.get("date_of_birth")
author.date_of_death = request.POST.get("date_of_death")
author.save()
return HttpResponseRedirect("/authors_add")
else:
return render(request, "edit1.html", {"author": author})
# --- Часть 3: Формы для Книг ---
class BookCreate(CreateView):
model = Book
fields = '__all__'
success_url = reverse_lazy('books')
class BookUpdate(UpdateView):
model = Book
fields = '__all__'
success_url = reverse_lazy('books')
class BookDelete(DeleteView):
model = Book
success_url = reverse_lazy('books')
Юрл
from django.contrib import admin
from django.urls import path, include
from catalog import views
urlpatterns = [
path('', views.index, name='index'),
path('admin/', admin.site.urls),
path('books/', views.BookListView.as_view(), name='books'),
path('book/<int:pk>/', views.BookDetailView.as_view(), name='book-detail'),
path('authors/', views.AuthorListView.as_view(), name='authors'),
path('accounts/', include('django.contrib.auth.urls')),
# Маршруты для ПЗ 10
path('mybooks/', views.LoanedBooksByUserListView.as_view(), name='my-borrowed'),
path('authors_add/', views.authors_add, name='authors_add'),
path('create/', views.create, name='create'),
path('edit1/<int:id>/', views.edit, name='edit'),
path('delete/<int:id>/', views.delete, name='delete'),
path('book/create/', views.BookCreate.as_view(), name='book_create'),
path('book/update/<int:pk>/', views.BookUpdate.as_view(), name='book_update'),
path('book/delete/<int:pk>/', views.BookDelete.as_view(), name='book_delete'),
]