服務端編程(十四)- 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上的源碼 可以參考 對照一下

後面我們就要開始起飛啦 也就是 這個圖書館應用的收官之戰 總攻開啓

我的專欄 希望能夠幫到你 ( •̀ ω •́ )✧

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