国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

利用Django通用類視圖(class-based view)編寫(xiě)數(shù)據(jù)驅(qū)動(dòng)(ModeForm)WEB

CarterLi / 1271人閱讀

摘要:既然是數(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就可以了。

view
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è)文件。

url
from django.conf.urls import patterns, url
from .view import SSHAuthListView
urlpatterns = patterns("",
    url(r"^sshAuth/$", SSHAuthListView.as_view(), name="listSSHAuth"),
template

    {% for item in object_list %}
        
    {% endfor %}
    
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)文檔

view
class 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。

form
from 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
{% csrf_token %} {% for field in form %} {% if field.errors %}
{% else %}
{% endif %} {{ field.label_tag }} {{ field }} {% for error in field.errors %} {{ error }} {% endfor %}
{% endfor %}
html

生成的html代碼如下:

在渲染的時(shí)候,Django已經(jīng)自動(dòng)根據(jù)model、form_class自動(dòng)處理了form的所有字段。包括type name id maxlength等屬性。


剩下的UpdateView以及DeleteView與CreateView的實(shí)現(xiàn)也是相類似的原理。需要注意的就是在view代碼中,即使是指定了form_class字段,而且form_class中也有指定model,但是還是需要在view代碼里給出model。具體實(shí)現(xiàn)不再贅述。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/37676.html

相關(guān)文章

  • Django中的文件上傳(利用class-based view)

    摘要:背景介紹在的官網(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ā)方式是...

    oogh 評(píng)論0 收藏0
  • Django搭建個(gè)人博客:基于視圖

    摘要:有編程基礎(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;而類視...

    QiShare 評(píng)論0 收藏0
  • django rest framework個(gè)人學(xué)習(xí)筆記(六)————Tutorial4.認(rèn)證于授權(quá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)...

    eternalshallow 評(píng)論0 收藏0
  • django rest framework個(gè)人學(xué)習(xí)筆記(六)————Tutorial4.認(rèn)證于授權(quá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)...

    MonoLog 評(píng)論0 收藏0
  • django rest framework個(gè)人學(xué)習(xí)筆記(六)————Tutorial4.認(rèn)證于授權(quá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)...

    caozhijian 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<