摘要:既然是數據驅動的,首先就必須要有數據。也符合它用于查看數據的需求。說明模板中的對象就是從中取出的數據。以的類型存儲著所有數據。修改視圖接下來就是第二類修改視圖了。其中的會將中的該字段設為類型而則是帶有清除文件功能的類型。
最近在學習Django,官方文檔介紹地十分詳細。但是“大而全”就難免會有些不夠速成,和我們這個浮躁的互聯網時代格格不入,所以我就整理了這個文檔。就像coolshell說的,一泡屎的時間就可以看完。
框架的好處就是,它已經為用戶處理了絕大多數的場景中的重復代碼,提供了封裝好的接口,使得我們在開發中十分方便。在web開發中,我們常常遇到的一個場景就是:頁面發起一個請求,后端執行相應的處理(修改數據、查詢數據、插入數據等操作),再予以返回。
對于這些場景,Django提供了幾個class-based view來處理:
ListView
UpdateView
CreateView
DeleteView
這幾個類視圖分別對應著查詢ListView、更新UpdateView、創建CreateView、刪除DeleteView這幾個操作。在整體上就可以分為查看、修改兩個類型。下面,我們來通過一個例子來展現一下這幾個View怎么使用。假設我們需要實現一個用于ssh驗證的web服務。用戶通過頁面可以新建、查看、修改用于ssh登陸驗證的內容(user、port、password、key)。
Model既然是數據驅動的WEB,首先就必須要有數據。
針對于我們的需求,數據庫設計如下:
class SSHAuth(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=50, unique=True) password = models.CharField(max_length=50, blank=True) privateKey = models.FileField(upload_to="sshKey", blank=True) user = models.CharField(max_length=30, blank=True) port = models.IntegerField(blank=True) # python3用__str__ def __unicode__(self): return u"%s" % self.name
這里涉及到文件上傳,想要了解可以參考我的另一篇整理文檔。
查詢視圖 ListView對應官網文檔
首先,從最簡單的展示開始。ListView可以通過你給出的model以及想要展示的model中的field,在對應的數據庫中查詢出對應的對象存放在List對象中,并傳遞給template渲染。這個view只實現了get方法,它只接受get請求。也符合它用于查看數據的需求。在代碼中,我們只需要指定它對應的模板,對應的model就可以了。
from django.views.generic.edit import CreateView class SSHAuthListView(ListView): template_name = "app_name/sshauth_list.html" model = SSHAuth
說明:
上面我沒有給出filed的值,默認就是SSHAuth這個model中的所有filed都將被展示。
其實template_name也可以不特別給出。如果你在Django設置settings.py中的TEMPLATES下配置了"APP_DIRS": True 的話,Django默認會去渲染/project/app_name/templates/app_name/sshauth_list.html這個文件。
from django.conf.urls import patterns, url from .view import SSHAuthListView urlpatterns = patterns("", url(r"^sshAuth/$", SSHAuthListView.as_view(), name="listSSHAuth"),template
ID | Name | Password | PrivateKey | User | Port |
---|---|---|---|---|---|
{{ item.id }} | {{ item.name }} | {{ item.password }} | {{ item.privateKey }} | {{ item.user }} | {{ item.port }} |
說明:
模板中的object_list對象就是view從model中取出的數據。以list的類型存儲著所有數據instance。這個"object_list"的變量名是Django默認提供的,也可以人為修改為你想要的變量名,詳細請看官網文檔。
接下來就是第二類修改視圖了。在web開發中約定俗成的規則是,對于查詢類的請求用get,對于修改類的請求用post。Django在設計的時候也遵循了這個原則,所以以下的每個view中,都具有支持get和post的函數。
CreateVIew:
get——根據model提供一個空form
post——接收從get發來的請求,數據合法性校驗,插入數據庫
UpdateView:
get——根據model從數據庫取出實例,并渲染form
post——接收從get來的請求,數據合法性校驗,并更新數據庫
CreateView對應官網文檔
viewclass SSHAuthCreateView(CreateView): template_name = "app_name/ssh_create.html" model = SSHAuth success_url = reverse_lazy("app_name:listSSHAuth")
說明:
model就是對應的數據庫,在get請求發送過來的時候,Django會根據model里的字段個數、類型渲染form。而在post請求發送過來的時候,Django會根據model里的field屬性去做合法性校驗(類型是否正確、字段是否必填等),在校驗成功以后重定向至success_url。
像上面的SSHAuthCreateView直接取model里面的數據,在password輸入的時候input的type默認取的是text(因為model為CharField)。但是我們想要它是一個password的type。或者你想給它加入class屬性,用于指定css。這樣的話,就要自定制form。可以自己寫一個form_class,然后在CreateView里面添加這個form_class。
formfrom django import forms from .models import SSHAuth, Inventory bootstrap_form_css_class = {"class": "form-control"} class SSHAuthBootstrapForm(forms.ModelForm): """ Use Bootstrap css. An abstract base class. """ class Meta: model = SSHAuth fields = ["name", "password", "privateKey", "user", "port"] # add html class attribute to form"s component. widgets = { "name": forms.TextInput(attrs=bootstrap_form_css_class), "password": forms.PasswordInput(attrs=bootstrap_form_css_class), "privateKey": forms.ClearableFileInput(attrs=bootstrap_form_css_class), #ClearableFileInput提供對UpdateView的clear支持 "user": forms.TextInput(attrs=bootstrap_form_css_class), "port": forms.TextInput(attrs=bootstrap_form_css_class), }
說明:
fields字段為想要展示的字段,因為id是自增的主鍵,所以不做修改。widgets為form的字段類型以及html屬性。其中的PasswordInput會將form中的該字段設為password類型;而ClearableFileInput則是帶有清除文件功能的類型。
這樣,只需要在view當中加入這個form_class就可以實現模板中渲染的form表單具有自定義的屬性了:
class SSHAuthCreateView(CreateView): template_name = "app_name/ssh_create.html" form_class = SSHAuthBootstrapForm success_url = reverse_lazy("app_name:listSSHAuth")url
url(r"^sshAuth/createItem/$", SSHAuthCreateView.as_view(), name="createSSHAuth"),template
摘要:背景介紹在的官網上有專門介紹如何處理文件上傳的文檔,其中說到了如何利用來處理文件上傳的場景。但是,在中最快速的開發方式是利用來進行開發。上面用到了動態的,對應每個都提供不同的上傳路徑。在實際的使用中,可以針對于自己的應用場景選擇。 背景介紹 在Django的官網上有專門介紹如何處理文件上傳的文檔,其中說到了如何利用model來處理文件上傳的場景。但是,在Django中最快速的開發方式是...
摘要:有編程基礎的同學都知道,類是面向對象技術中非常重要的概念。有區別的是,是作為功能添加到子類中的,而不是作為父類。首先調用父類方法,將這個對象賦值給變量,然后再對其進行統計瀏覽量的操作,最后將對象返回。 說是完結,馬上又開始寫進階篇了。 本章不會為博客項目增加新功能,但是也同樣重要,因為我們要學習高逼格的基于類的視圖。 什么是類視圖 前面章節中寫的所有視圖都是基于函數的,即def;而類視...
摘要:另外一個字段用于儲存突出顯示的代碼的表示形式。這將確保認證用戶擁有讀寫權限,而未認證用戶只有讀的權限。唯一的限制是必須是。 官網地址目前,我們的API沒有對如 edit 或者 delect做出任何限制。我們希望有一些更加高級的功能能夠做到: Code snippets 應該永遠和創建者相關 只有認證的用戶才能夠創建snippets 只有創建者才能更新或者刪除他的snippet 沒有認...
摘要:另外一個字段用于儲存突出顯示的代碼的表示形式。這將確保認證用戶擁有讀寫權限,而未認證用戶只有讀的權限。唯一的限制是必須是。 官網地址目前,我們的API沒有對如 edit 或者 delect做出任何限制。我們希望有一些更加高級的功能能夠做到: Code snippets 應該永遠和創建者相關 只有認證的用戶才能夠創建snippets 只有創建者才能更新或者刪除他的snippet 沒有認...
摘要:另外一個字段用于儲存突出顯示的代碼的表示形式。這將確保認證用戶擁有讀寫權限,而未認證用戶只有讀的權限。唯一的限制是必須是。 官網地址目前,我們的API沒有對如 edit 或者 delect做出任何限制。我們希望有一些更加高級的功能能夠做到: Code snippets 應該永遠和創建者相關 只有認證的用戶才能夠創建snippets 只有創建者才能更新或者刪除他的snippet 沒有認...
閱讀 649·2021-11-25 09:43
閱讀 1920·2021-11-17 09:33
閱讀 834·2021-09-07 09:58
閱讀 2068·2021-08-16 10:52
閱讀 490·2019-08-30 15:52
閱讀 1730·2019-08-30 15:43
閱讀 996·2019-08-30 15:43
閱讀 2934·2019-08-29 16:41