摘要:既然是數(shù)據(jù)驅(qū)動(dòng)的,首先就必須要有數(shù)據(jù)。也符合它用于查看數(shù)據(jù)的需求。說(shuō)明模板中的對(duì)象就是從中取出的數(shù)據(jù)。以的類型存儲(chǔ)著所有數(shù)據(jù)。修改視圖接下來(lái)就是第二類修改視圖了。其中的會(huì)將中的該字段設(shè)為類型而則是帶有清除文件功能的類型。
最近在學(xué)習(xí)Django,官方文檔介紹地十分詳細(xì)。但是“大而全”就難免會(huì)有些不夠速成,和我們這個(gè)浮躁的互聯(lián)網(wǎng)時(shí)代格格不入,所以我就整理了這個(gè)文檔。就像coolshell說(shuō)的,一泡屎的時(shí)間就可以看完。
框架的好處就是,它已經(jīng)為用戶處理了絕大多數(shù)的場(chǎng)景中的重復(fù)代碼,提供了封裝好的接口,使得我們?cè)陂_(kāi)發(fā)中十分方便。在web開(kāi)發(fā)中,我們常常遇到的一個(gè)場(chǎng)景就是:頁(yè)面發(fā)起一個(gè)請(qǐng)求,后端執(zhí)行相應(yīng)的處理(修改數(shù)據(jù)、查詢數(shù)據(jù)、插入數(shù)據(jù)等操作),再予以返回。
對(duì)于這些場(chǎng)景,Django提供了幾個(gè)class-based view來(lái)處理:
ListView
UpdateView
CreateView
DeleteView
這幾個(gè)類視圖分別對(duì)應(yīng)著查詢ListView、更新UpdateView、創(chuàng)建CreateView、刪除DeleteView這幾個(gè)操作。在整體上就可以分為查看、修改兩個(gè)類型。下面,我們來(lái)通過(guò)一個(gè)例子來(lái)展現(xiàn)一下這幾個(gè)View怎么使用。假設(shè)我們需要實(shí)現(xiàn)一個(gè)用于ssh驗(yàn)證的web服務(wù)。用戶通過(guò)頁(yè)面可以新建、查看、修改用于ssh登陸驗(yàn)證的內(nèi)容(user、port、password、key)。
Model既然是數(shù)據(jù)驅(qū)動(dòng)的WEB,首先就必須要有數(shù)據(jù)。
針對(duì)于我們的需求,數(shù)據(jù)庫(kù)設(shè)計(jì)如下:
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對(duì)應(yīng)官網(wǎng)文檔
首先,從最簡(jiǎn)單的展示開(kāi)始。ListView可以通過(guò)你給出的model以及想要展示的model中的field,在對(duì)應(yīng)的數(shù)據(jù)庫(kù)中查詢出對(duì)應(yīng)的對(duì)象存放在List對(duì)象中,并傳遞給template渲染。這個(gè)view只實(shí)現(xiàn)了get方法,它只接受get請(qǐng)求。也符合它用于查看數(shù)據(jù)的需求。在代碼中,我們只需要指定它對(duì)應(yīng)的模板,對(duì)應(yīng)的model就可以了。
from django.views.generic.edit import CreateView class SSHAuthListView(ListView): template_name = "app_name/sshauth_list.html" model = SSHAuth
說(shuō)明:
上面我沒(méi)有給出filed的值,默認(rèn)就是SSHAuth這個(gè)model中的所有filed都將被展示。
其實(shí)template_name也可以不特別給出。如果你在Django設(shè)置settings.py中的TEMPLATES下配置了"APP_DIRS": True 的話,Django默認(rèn)會(huì)去渲染/project/app_name/templates/app_name/sshauth_list.html這個(gè)文件。
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 }} |
說(shuō)明:
模板中的object_list對(duì)象就是view從model中取出的數(shù)據(jù)。以list的類型存儲(chǔ)著所有數(shù)據(jù)instance。這個(gè)"object_list"的變量名是Django默認(rèn)提供的,也可以人為修改為你想要的變量名,詳細(xì)請(qǐng)看官網(wǎng)文檔。
接下來(lái)就是第二類修改視圖了。在web開(kāi)發(fā)中約定俗成的規(guī)則是,對(duì)于查詢類的請(qǐng)求用get,對(duì)于修改類的請(qǐng)求用post。Django在設(shè)計(jì)的時(shí)候也遵循了這個(gè)原則,所以以下的每個(gè)view中,都具有支持get和post的函數(shù)。
CreateVIew:
get——根據(jù)model提供一個(gè)空f(shuō)orm
post——接收從get發(fā)來(lái)的請(qǐng)求,數(shù)據(jù)合法性校驗(yàn),插入數(shù)據(jù)庫(kù)
UpdateView:
get——根據(jù)model從數(shù)據(jù)庫(kù)取出實(shí)例,并渲染form
post——接收從get來(lái)的請(qǐng)求,數(shù)據(jù)合法性校驗(yàn),并更新數(shù)據(jù)庫(kù)
CreateView對(duì)應(yīng)官網(wǎng)文檔
viewclass SSHAuthCreateView(CreateView): template_name = "app_name/ssh_create.html" model = SSHAuth success_url = reverse_lazy("app_name:listSSHAuth")
說(shuō)明:
model就是對(duì)應(yīng)的數(shù)據(jù)庫(kù),在get請(qǐng)求發(fā)送過(guò)來(lái)的時(shí)候,Django會(huì)根據(jù)model里的字段個(gè)數(shù)、類型渲染form。而在post請(qǐng)求發(fā)送過(guò)來(lái)的時(shí)候,Django會(huì)根據(jù)model里的field屬性去做合法性校驗(yàn)(類型是否正確、字段是否必填等),在校驗(yàn)成功以后重定向至success_url。
像上面的SSHAuthCreateView直接取model里面的數(shù)據(jù),在password輸入的時(shí)候input的type默認(rèn)取的是text(因?yàn)閙odel為CharField)。但是我們想要它是一個(gè)password的type。或者你想給它加入class屬性,用于指定css。這樣的話,就要自定制form。可以自己寫(xiě)一個(gè)form_class,然后在CreateView里面添加這個(gè)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提供對(duì)UpdateView的clear支持 "user": forms.TextInput(attrs=bootstrap_form_css_class), "port": forms.TextInput(attrs=bootstrap_form_css_class), }
說(shuō)明:
fields字段為想要展示的字段,因?yàn)閕d是自增的主鍵,所以不做修改。widgets為form的字段類型以及html屬性。其中的PasswordInput會(huì)將form中的該字段設(shè)為password類型;而ClearableFileInput則是帶有清除文件功能的類型。
這樣,只需要在view當(dāng)中加入這個(gè)form_class就可以實(shí)現(xiàn)模板中渲染的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
摘要:背景介紹在的官網(wǎng)上有專門(mén)介紹如何處理文件上傳的文檔,其中說(shuō)到了如何利用來(lái)處理文件上傳的場(chǎng)景。但是,在中最快速的開(kāi)發(fā)方式是利用來(lái)進(jìn)行開(kāi)發(fā)。上面用到了動(dòng)態(tài)的,對(duì)應(yīng)每個(gè)都提供不同的上傳路徑。在實(shí)際的使用中,可以針對(duì)于自己的應(yīng)用場(chǎng)景選擇。 背景介紹 在Django的官網(wǎng)上有專門(mén)介紹如何處理文件上傳的文檔,其中說(shuō)到了如何利用model來(lái)處理文件上傳的場(chǎng)景。但是,在Django中最快速的開(kāi)發(fā)方式是...
摘要:有編程基礎(chǔ)的同學(xué)都知道,類是面向?qū)ο蠹夹g(shù)中非常重要的概念。有區(qū)別的是,是作為功能添加到子類中的,而不是作為父類。首先調(diào)用父類方法,將這個(gè)對(duì)象賦值給變量,然后再對(duì)其進(jìn)行統(tǒng)計(jì)瀏覽量的操作,最后將對(duì)象返回。 說(shuō)是完結(jié),馬上又開(kāi)始寫(xiě)進(jìn)階篇了。 本章不會(huì)為博客項(xiàng)目增加新功能,但是也同樣重要,因?yàn)槲覀円獙W(xué)習(xí)高逼格的基于類的視圖。 什么是類視圖 前面章節(jié)中寫(xiě)的所有視圖都是基于函數(shù)的,即def;而類視...
摘要:另外一個(gè)字段用于儲(chǔ)存突出顯示的代碼的表示形式。這將確保認(rèn)證用戶擁有讀寫(xiě)權(quán)限,而未認(rèn)證用戶只有讀的權(quán)限。唯一的限制是必須是。 官網(wǎng)地址目前,我們的API沒(méi)有對(duì)如 edit 或者 delect做出任何限制。我們希望有一些更加高級(jí)的功能能夠做到: Code snippets 應(yīng)該永遠(yuǎn)和創(chuàng)建者相關(guān) 只有認(rèn)證的用戶才能夠創(chuàng)建snippets 只有創(chuàng)建者才能更新或者刪除他的snippet 沒(méi)有認(rèn)...
摘要:另外一個(gè)字段用于儲(chǔ)存突出顯示的代碼的表示形式。這將確保認(rèn)證用戶擁有讀寫(xiě)權(quán)限,而未認(rèn)證用戶只有讀的權(quán)限。唯一的限制是必須是。 官網(wǎng)地址目前,我們的API沒(méi)有對(duì)如 edit 或者 delect做出任何限制。我們希望有一些更加高級(jí)的功能能夠做到: Code snippets 應(yīng)該永遠(yuǎn)和創(chuàng)建者相關(guān) 只有認(rèn)證的用戶才能夠創(chuàng)建snippets 只有創(chuàng)建者才能更新或者刪除他的snippet 沒(méi)有認(rèn)...
摘要:另外一個(gè)字段用于儲(chǔ)存突出顯示的代碼的表示形式。這將確保認(rèn)證用戶擁有讀寫(xiě)權(quán)限,而未認(rèn)證用戶只有讀的權(quán)限。唯一的限制是必須是。 官網(wǎng)地址目前,我們的API沒(méi)有對(duì)如 edit 或者 delect做出任何限制。我們希望有一些更加高級(jí)的功能能夠做到: Code snippets 應(yīng)該永遠(yuǎn)和創(chuàng)建者相關(guān) 只有認(rèn)證的用戶才能夠創(chuàng)建snippets 只有創(chuàng)建者才能更新或者刪除他的snippet 沒(méi)有認(rèn)...
閱讀 638·2021-11-25 09:43
閱讀 1906·2021-11-17 09:33
閱讀 824·2021-09-07 09:58
閱讀 2062·2021-08-16 10:52
閱讀 482·2019-08-30 15:52
閱讀 1722·2019-08-30 15:43
閱讀 974·2019-08-30 15:43
閱讀 2924·2019-08-29 16:41