反向解析的应用示例: 多个页面的删除函数合并为一个

在开发后台管理系统的时候,通常会有多个展示页面,比如book展示页面, author的展示页面, 还有出版社的展示页面. 

通常我们会对每一个页面写增删改查, 这样就会写3套重复的函数. 这些函数的逻辑都是一样的,只有部分的参数不一样.

这里我们以删除为例,看看怎么把多个函数重复的函数用一个函数实现所有的功能.

我们以book展示页和author的展示页为例子,通过一个delete函数,控制这两个页面的删除键

第一步: 在url中配置路径, 把需要删除的页面对应的表名写进去,拼路径

知识点: 正则表达式, 分组命名

    #把书籍,作者,出版社的删除 合并成一个删除路径
    re_path("(^book|publish|author)/delete/(d+)$",views.delete),
              #表名小写

第二步: 在view视图函数中定义删除函数

知识点: 反向解析, 反射, 还有一点就是table直接用表名小写,通过 table.capitalize() 转换成对应的表名, 然后进行ORM操作

# 通过反向解析 和 反射实现的
#把书籍,作者,出版社的删除 合并成一个删除路径
def delete(request,table,pk):
    #table ---> ‘book’ 'publish' 'author'   pk 要删除对象的ID
    table_dict={
    "book":models.Book,
    "publish":models.Publish,
    "author":models.Author
    }
    # table.capitalize() #大写 ‘book’ ——》  “Book”
    table_class=getattr(models,table.capitalize()) #getattr(models, 'Book') ——》 models.Book
    # ‘Book’ 'Publish'
    table_class.objects.filter(pk=pk).delete()
    return redirect(reverse(table))
    # 反向解析  ‘book’  ——》 ‘/books/’  跳转到book的展示页面的url
    #重定向到展示页面, 给展示页面的url 取别名=对应的表名小写

第三步:在url 中写book 和 author 的别名

path("books/",views.book_view,name="book"),

path("author_view/",views.author_view,name="author"),

第四步:分别在 book和author 的展示页面的html中写删除时走的路径

<a href="/book/delete/{{ book.pk }}" class="btn btn-danger btn-sm">删除</a>
<a href="/author/delete/{{ author.pk }}" class="btn btn-danger btn-sm">删除</a>

这样就可以用一个函数,控制多个页面的删除按钮了.

原文地址:https://www.cnblogs.com/kenD/p/10073047.html