zoukankan      html  css  js  c++  java
  • Python

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

    <!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

  • 相关阅读:
    LeetCode 515. 在每个树行中找最大值(Find Largest Value in Each Tree Row)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 1022. 从根到叶的二进制数之和(Sum of Root To Leaf Binary Numbers)
    LeetCode 897. 递增顺序查找树(Increasing Order Search Tree)
    LeetCode 617. 合并二叉树(Merge Two Binary Trees)
    LeetCode 206. 反转链表(Reverse Linked List) 16
    LeetCode 104. 二叉树的最大深度(Maximum Depth of Binary Tree)
    LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15
    LeetCode 108. 将有序数组转换为二叉搜索树(Convert Sorted Array to Binary Search Tree) 14
  • 原文地址:https://www.cnblogs.com/sch01ar/p/11241368.html
Copyright © 2011-2022 走看看