前言 ´・ᴗ・`
- 本節先簡要拓展了前面學習的視圖方面的簡單應用
- 本篇內容將會幫助你學習以下技能
- 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一個特殊版本
接下來就是模板了
其實就只有兩種
- 增 改的模板
- 刪除的模板
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上的源碼 可以參考 對照一下
後面我們就要開始起飛啦 也就是 這個圖書館應用的收官之戰 總攻開啓
我的專欄 希望能夠幫到你 ( •̀ ω •́ )✧
-
本文專欄
手把手帶你學後端(服務端) -
想學習數據庫嘛? 不妨從MySQL入手
MySQL專欄 -
python這麼火 想要深入學習python 玩一下簡單的應用嘛?
python應用 -
謝謝大佬支持! 萌新有禮了:)