服务端编程(十四)- Django - 视图 模板设计的补充

前言 ´・ᴗ・`

  • 本节先简要拓展了前面学习的视图方面的简单应用
  • 本篇内容将会帮助你学习以下技能
    • 1 如何使用CreateView, UpdateView, DeleteView
    • 2 如何自制模板‘
  • 在图书馆应用方面 本篇将会带您…
    • 1 为图书馆应用添加 管理员添加书本 作者的方法

CreateView, UpdateView, DeleteView

我们上节拓展了 对于续借操作的支持
这里通过CreateView UpdateView DeleteView 来支持对作者数据 以及图书数据的增删改查
明显

  • 增 CreateView
  • 删 DeleteView
  • 改 UpdateView
  • 查 ListView (之前说过)

Django已经帮我们把这些东西建立模板 我们不用费心底层的一些debug
当然 后期还是要自己动手 这里是为了尽快上手才用Django的模板的

好 在view.py 添加:

from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .models import Author

class AuthorCreate(CreateView):
    model = Author
    fields = '__all__'
    initial={'date_of_death':'05/01/2018',}

class AuthorUpdate(UpdateView):
    model = Author
    fields = ['first_name','last_name','date_of_birth','date_of_death']

class AuthorDelete(DeleteView):
    model = Author
    success_url = reverse_lazy('authors')
  • model 我们玩过listView 知道这个就是 直接绑定数据库模型ORM的操作了
  • field 指的是 你想要显示的表单的字段
    比如 注册的时候写的 用户名 密码 验证码 这类的“字段”
  • success_url 就是你删除完以后 需要显示 你是否真的删除成功 所以跳转到author页面
    这一项就是 操作成功(success)后跳转的页面
  • initial 默认值设置 还记得placeholder吧
  • reverse_lazy() 也就是reverse一个特殊版本

接下来就是模板了
其实就只有两种

  1. 增 改的模板
  2. 删除的模板

Django要求模板命名就有规范:)

这个是模板1 用<model的名称>_form.html 这种格式
locallibrary/catalog/templates/catalog/author_form.html:

{% extends "base_generic.html" %}

{% block content %}

<form action="" method="post">
    {% csrf_token %}
    <table>
    {{ form.as_table }}
    </table>
    <input type="submit" value="Submit" />
    
</form>
{% endblock %}

这个是模板2:<model_name>_confirm_delete.html
locallibrary/catalog/templates/catalog/author_confirm_delete.html

{% extends "base_generic.html" %}

{% block content %}

<h1>Delete Author</h1>

<p>Are you sure you want to delete the author: {{ author }}?</p>

<form action="" method="POST">
  {% csrf_token %}
  <input type="submit" action="" value="Yes, delete." />
</form>

{% endblock %}

接下来url映射添加 正常操作:

    path('author/create/', views.AuthorCreate.as_view(), name='author_create'),
    path('author/<int:pk>/update/', views.AuthorUpdate.as_view(), name='author_update'),
    path('author/<int:pk>/delete/', views.AuthorDelete.as_view(), name='author_delete'),

然后 我们还得添加权限
并且把主页index 简要修改一波:)
效果大概是这样的:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里上代码:
locallibrary/catalog/templates/catalog/author_form.html:

{% extends "base_generic.html" %}

{% block content %}

<form action="" method="post">
    {% csrf_token %}
    <table>
    {{ form.as_table }}
    </table>
    <input type="submit" value="Submit" />

</form>
{% endblock %}

locallibrary/catalog/templates/catalog/author_confirm_delete.html

{% extends "base_generic.html" %}

{% block content %}

<h1>Delete Book</h1>

<p>Are you sure you want to delete the book: {{ book }}?</p>

<form action="" method="POST">
  {% csrf_token %}
  <input type="submit" action="" value="Yes, delete." />
</form>

{% endblock %}

注意没有 这个模板和之前的几乎完全一样 这就是Django封装的好处
可惜 我们应该会设计自己的前端 所以这里也就玩玩就好

url.py 正常套路 添加新的映射 注意映射的名字是用在模板里面的 别乱取名字:)否则来回复制粘贴

    path('book/create/', views.BookCreate.as_view(), name='book_create'),
    path('book/<int:pk>/update/', views.BookUpdate.as_view(), name='book_update'),
    path('book/<int:pk>/delete/', views.BookDelete.as_view(), name='book_delete'),

这下 管理员添加书本 作者的页面就搞定了

学会自制简单的模板

我们之间复制粘贴很多模板了其实
也知道模板变量的含义
这里我们不讲那些基础的语法 比如extends 还有if else 那些你看看就懂了
讲一下模板中怎么链接url

以我们加下来需要设计的的 管理员添加书本 作者这个为例:

我们要改造原有的authorlist booklist 还有主页:
使得有链接能够 联结到 我们已经做好的页面

authorlist 添加这句 (学会看懂意思 你就可以自定义了:))

{% if perms.catalog.set_book_as_returned %}
          - <a href="{% url 'author_update' author.id %}">change</a>
          - <a href="{% url 'author_delete' author.id %}">delete</a>
        {% endif %}

perms.catalog.set_book_as_returned 这句在 权限那一篇文章我们已经讲过了:)

booklist 添加这句:

{% if perms.catalog.set_book_as_returned %}
          - <a href="{% url 'book_update' book.id %}">change</a>
          - <a href="{% url 'book_delete' book.id %}">delete</a>
        {% endif %}

观察格式:url '<url映射的名字>' 传递的参数
看下url匹配规则咋说的:path('book/<int:pk>/delete/', views.BookDelete.as_view(), name='book_delete'),
传递的参数就到int:pk面去了
很机智啊Django( ̄︶ ̄)↗ 
另外
这里并非采用硬编码 即,不是这么写的:

{% if perms.catalog.set_book_as_returned %}
          - <a href="/catalog/book/{{ book.id }}/update/">change</a>
          - <a href="/catalog/book/{{ book.id }}/delete/">delete</a>
        {% endif %}

这就是灵活性所在——如果映射名字不变 你想改什么url都行 比如想要加密 不让外人看懂
内部却有很简单的沟通方式

最后 base_generic.html:

{% if perms.catalog.set_book_as_returned %}
          <ul>
            <li>-----------</li>
            <li><a href="{% url 'all-borrowed' %}">borrowed books manage</a></li>
            <li><a href="{% url 'book_create' %}">add books</a> </li>
            <li><a href="{% url 'author_create' %}">add authors</a> </li>
          </ul>
          {% endif %}

赋予 图书管理员的专区 —— 添加书本和作者
当然你还可以添加书本实例 几乎是一样的简单

总结 ´◡`

这篇其实就是前面几篇的延伸
我们到这里 就已经算是能够活学活用Django的各个方面了
Django的基础就差不多了

这里建议你总结一下 看看哪里还有遗漏的问题
这是我放在github上的源码 可以参考 对照一下

后面我们就要开始起飞啦 也就是 这个图书馆应用的收官之战 总攻开启

我的专栏 希望能够帮到你 ( •̀ ω •́ )✧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章