Python - Django - 编辑作者

在作者列表页面的操作栏中加上编辑按钮

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>作者列表</title>
</head>
<body>

<h1>作者列表</h1>

<table border="1">
    <thead>
    <tr>
        <th>#</th>
        <th>id</th>
        <th>名字</th>
        <th>书籍</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    {% for author in author_list %}
        <tr>
            <td>{{ forloop.counter }}</td>
            <td>{{ author.id }}</td>
            <td>{{ author.name }}</td>
            <td>
                {% for book in author.book.all %}
                    {% if forloop.last %}
                        {{ book.title }}
                    {% else %}
                        {{ book.title }} |
                    {% endif %}
                {% endfor %}
            </td>

            <td>
                <a href="/del_author/?id={{ author.id }}">删除</a>
                <a href="/edit_author/?id={{ author.id }}">编辑</a>
            </td>
        </tr>
    {% endfor %}
    </tbody>
</table>

<a href="/add_author/">添加书籍</a>

</body>
</html>

运行结果:

添加 edit_author.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>编辑作者</title>
</head>
<body>

<h1>编辑作者</h1>

<form action="/edit_author/" method="post">
    <input type="text" name="author_id" value="{{ author.id }}" style="display: none">
    <p>
        作者姓名:<input type="text" name="author_name" value="{{ author.name }}">
    </p>

    <p>
        书籍:
        <select multiple name="books">
            {% for book in book_list %}
                {% if book in author.book.all %}
                    <option selected value="{{ book.id }}">{{ book.title }}</option>
                {% else %}
                    <option value="{{ book.id }}">{{ book.title }}</option>
                {% endif %}
            {% endfor %}
        </select>
    </p>

    <p>
        <input type="submit" value="提交">
    </p>
</form>

</body>
</html>

解析:

在 urls.py 中添加 edit_author 的对应关系

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    # 出版社
    url(r'^publisher_list/', views.publisher_list),
    url(r'^add_publisher/', views.add_publisher),
    url(r'^del_publisher/', views.del_publisher),
    url(r'^edit_publisher/', views.edit_publisher),
    # 书籍
    url(r'^book_list/', views.book_list),
    url(r'^add_book/', views.add_book),
    url(r'^del_book/', views.del_book),
    url(r'^edit_book/', views.edit_book),
    # 作者
    url(r'^author_list/', views.author_list),
    url(r'^add_author/', views.add_author),
    url(r'^del_author/', views.del_author),
    url(r'^edit_author/', views.edit_author),
]

在 views.py 中添加 edit_author 函数

from django.shortcuts import render, redirect, HttpResponse
from app01 import models


# 展示出版社列表
def publisher_list(request):
    pass


# 添加新的出版社
def add_publisher(request):
    pass


# 删除出版社
def del_publisher(request):
    pass


# 编辑出版社
def edit_publisher(request):
    pass


# 展示书籍列表
def book_list(request):
    pass


# 添加书籍
def add_book(request):
    pass


# 删除书籍
def del_book(request):
    pass


# 编辑书籍
def edit_book(request):
    pass


# 作者列表
def author_list(request):
    # 查询所有作者
    all_author = models.Author.objects.all()
    return render(request, "author_list.html", {"author_list": all_author})


# 添加作者
def add_author(request):
    if request.method == "POST":
        # 取得提交的数据
        new_author_name = request.POST.get("author_name")
        # 如果提交的数据是多个值的话用 getlist
        books = request.POST.getlist("books")
        # 创建作者
        new_author_obj = models.Author.objects.create(name=new_author_name)
        # 把新作者和书籍建立对应关系,自动提交
        new_author_obj.book.set(books)
        # 跳转到作者列表页面,查看是否添加成功
        return redirect("/author_list/")
    # 查询所有的书籍
    all_books = models.Book.objects.all()
    return render(request, "add_author.html", {"book_list": all_books})


# 删除作者
def del_author(request):
    # 从 url 里提取要删除的作者 id
    del_id = request.GET.get("id")
    # 根据 id 删除 author 表和其相关联表的数据
    models.Author.objects.get(id=del_id).delete()
    # 返回作者列表
    return redirect("author_list.html")


# 编辑作者
def edit_author(request):
    # 从 post 提交过来的书籍
    if request.method == "POST":
        # 获取提交过来的作者 id 和姓名
        edit_author_id = request.POST.get("author_id")
        new_author_name = request.POST.get("author_name")
        # 获取提交过来和作者相关联的书籍
        new_book = request.POST.getlist("books")
        # 根据 id 去数据库中查询当前编辑的作者对象
        edit_author_obj = models.Author.objects.get(id=edit_author_id)
        # 更新数据库中作者的名字
        edit_author_obj.name = new_author_name
        # 更新数据库中与作者关联的书籍的对应关系
        edit_author_obj.book.set(new_book)
        # 将修改保存到数据库中
        edit_author_obj.save()
        # 返回作者列表页面,查看编辑是否成功
        return redirect("/author_list/")

    # 从 url 里获取要编辑作者的 id
    edit_id = request.GET.get("id")
    # 获取要编辑的作者对象
    edit_author_obj = models.Author.objects.get(id=edit_id)

    # 获取对象书籍对象
    all_book_list = models.Book.objects.all()
    return render(request, "edit_author.html", {"book_list": all_book_list, "author": edit_author_obj})

运行效果:

编辑 John

《Java》和《C》默认是被选择的,将 《Python》也选上

提交后

来数据库中看一下

作者 id 为 1 的关联书籍多了一个 2

posted @ 2019-07-24 22:39  Sch01aR#  阅读(328)  评论(0编辑  收藏  举报