from django.db import models
from django.urls import reverse
from django.core.validators import MinValueValidator
class Book(models.Model):
"""图书模型"""
title = models.CharField('书名', max_length=200)
author = models.CharField('作者', max_length=100)
publish_date = models.DateField('出版日期')
isbn = models.CharField('ISBN', max_length=13, unique=True)
price = models.DecimalField('价格', max_digits=10, decimal_places=2,
validators=[MinValueValidator(0)])
description = models.TextField('描述', blank=True)
cover_image = models.ImageField('封面图', upload_to='book_covers/', blank=True, null=True)
created_at = models.DateTimeField('创建时间', auto_now_add=True)
updated_at = models.DateTimeField('更新时间', auto_now=True)
def __str__(self):
return self.title
def get_absolute_url(self):
"""获取图书详情页URL"""
return reverse('books:book_detail', args=[str(self.id)])
from django.urls import path
from . import views
app_name = 'books' # 命名空间
urlpatterns = [
# 图书列表页
path('', views.book_list, name='book_list'),
# 创建图书
path('create/', views.book_create, name='book_create'),
# 图书详情页
path('<int:pk>/', views.book_detail, name='book_detail'),
# 更新图书
path('<int:pk>/update/', views.book_update, name='book_update'),
# 删除图书
path('<int:pk>/delete/', views.book_delete, name='book_delete'),
]
def book_list(request):
"""图书列表视图"""
# 获取所有图书
books_list = Book.objects.all()
# 分页处理
paginator = Paginator(books_list, 10) # 每页10条
page = request.GET.get('page')
try:
books = paginator.page(page)
except PageNotAnInteger:
books = paginator.page(1)
except EmptyPage:
books = paginator.page(paginator.num_pages)
context = {
'books': books,
'page_obj': books,
}
return render(request, 'books/book_list.html', context)
{% extends 'books/base.html' %}
{% block content %}
<h1>图书列表</h1>
{% if books %}
<table class="table table-hover">
<thead>
<tr>
<th>书名</th>
<th>作者</th>
<th>价格</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for book in books %}
<tr>
<td>{{ book.title }}</td>
<td>{{ book.author }}</td>
<td>{{ book.price }}</td>
<td>
<a href="{% url 'books:book_detail' book.pk %}" class="btn btn-info btn-sm">查看</a>
<a href="{% url 'books:book_update' book.pk %}" class="btn btn-warning btn-sm">编辑</a>
<a href="{% url 'books:book_delete' book.pk %}" class="btn btn-danger btn-sm">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% endblock %}
from django import forms
from .models import Book
class BookForm(forms.ModelForm):
"""图书表单"""
class Meta:
model = Book
fields = ['title', 'author', 'publish_date', 'isbn',
'price', 'description', 'cover_image']
@classmethod
def search_books(cls, query):
"""搜索图书"""
from django.db.models import Q
return cls.objects.filter(
Q(title__icontains=query) |
Q(author__icontains=query) |
Q(isbn__icontains=query) |
Q(description__icontains=query)
).distinct()