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

  • 相关阅读:
    java复习计划
    超过16位的字符串装16进制
    《将博客搬至CSDN》
    android设置中文字体样式
    布局文件View和ViewGroup
    创建线程的两种方法,继承Thread,继承Runnable
    本地文件的copy复制
    字节流和字符流完成URL下载,并存入本地
    文本过滤器的用法,FileFilter()和FilenameFilter()
    JavaSE笔记
  • 原文地址:https://www.cnblogs.com/sch01ar/p/11241368.html
Copyright © 2011-2022 走看看