project目录
urls.py
from django.contrib import admin
from django.urls import path
from publisher import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.publisher_list),
path('publisher_list/', views.publisher_list),
path('add_publisher/', views.add_publisher),
path('del_publisher/', views.del_publisher),
path('edit_publisher/', views.edit_publisher),
path('book_list/', views.book_list),
path('add_book/', views.add_book),
path('del_book/', views.del_book),
path('edit_book/', views.edit_book),
path('author_list/', views.author_list),
path('add_author/', views.add_author),
path('del_author/', views.del_author),
path('edit_author/', views.edit_author),
]
models.py
from django.db import models
class Publisher(models.Model):
pid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32, unique=True)
def __str__(self):
return '{} - {}'.format(self.pid, self.name)
class Book(models.Model):
name = models.CharField(max_length=32, unique=True)
pub = models.ForeignKey('Publisher', on_delete=models.CASCADE)
class Author(models.Model):
name = models.CharField(max_length=32)
book = models.ManyToManyField('Book')
views.py
def author_list(request):
all_authors = models.Author.objects.all()
return render(request, 'author_list.html', {'all_authors': all_authors})
def add_author(request):
if request.method == 'POST':
author_name = request.POST.get('author_name')
books = request.POST.getlist('books')
author_obj = models.Author.objects.create(name=author_name)
author_obj.book.set(books)
return redirect('/author_list/')
all_books = models.Book.objects.all()
return render(request, 'add_author.html', {'all_books': all_books})
def del_author(request):
author_id = request.GET.get('pk')
models.Author.objects.filter(id=author_id).delete()
return redirect('/author_list/')
def edit_author(request):
author_id = request.GET.get('pk')
author_obj = models.Author.objects.get(id=author_id)
if request.method == 'POST':
name = request.POST.get('author_name')
books = request.POST.getlist('books')
author_obj.name = name
author_obj.save()
author_obj.book.set(books)
return redirect('/author_list/')
all_books = models.Book.objects.all()
print(all_books)
return render(request, 'edit_author.html', {'author_obj': author_obj, 'all_books': all_books})
author_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<th>序号</th>
<th>ID</th>
<th>姓名</th>
<th>代表作</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for all_author in all_authors %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ all_author.pk }}</td>
<td>{{ all_author.name }}</td>
<td>
{% for book in all_author.book.all %}
{% if forloop.last %}
<{{ book.name }}>
{% else %}
<{{ book.name }}>,
{% endif %}
{% endfor %}
</td>
<td>
<a href="/del_author/?pk={{ all_author.pk }}">删除</a>
<a href="/edit_author/?pk={{ all_author.pk }}">编辑</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
add_author.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post" >
<p>作者姓名:<input type="text" name="author_name"></p>
<p>
作品:
<select name="books" id="" multiple>
{% for book in all_books %}
<option value="{{ book.pk }}">{{ book.name }}</option>
{% endfor %}
</select>
</p>
<button>提交</button>
</form>
</body>
</html>
edit_author.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
<p>作者姓名:<input type="text" name="author_name" value="{{ author_obj.name}}"></p>
<p>
作品:
<select name="books" id="" multiple>
{% for book in all_books %}
{% if book in author_obj.book.all %}
<option value="{{ book.pk }}" selected>{{ book.name }}</option>
{% else %}
<option value="{{ book.pk }}">{{ book.name }}</option>
{% endif %}
{% endfor %}
</select>
</p>
<button>提交</button>
</form>
</body>
</html>