Django Form表單學習總結(jié)

Form中添加自定義的驗證:
???1.對特定字段屬性的驗證;
???2.包含多字段的驗證.
先創(chuàng)建一個簡單的Form:

from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    sender = forms.EmailField()
    recipients = MultiEmailField()
    cc_myself = forms.BooleanField(required=False)

1.驗證特定字段屬性

使用表單子類中的clean_<fieldname>()方法 -- <fieldname>通過表單中的字段名稱替換.這個方法完成特定屬性相關的驗證,這個驗證與字段的類型無關.這個方法沒有任何傳入的參數(shù).你需要查找self.cleaned_data中該字段的值,記住此時它已經(jīng)是一個python對象而不是表單中提交的原始字符串(它位于cleaned_data中是因為字段clean()方法已經(jīng)驗證過一次數(shù)據(jù)).
例如,在ContactForm中,我們想確保recipients字段始終包含'fred@example.com'.這是特定于我們這個表單的驗證,所以我們打算將它放在通用的MultiEmailField類中.編寫一個運行在recipients字段上的驗證方法:

from django import forms

class ContactForm(forms.Form):
    #Everything as before
    ...
    def clean_recipients(self):
        data = self.cleaned_data['recipients']
        if 'fred@example.com' not in data:
            raise forms.ValidationError('You havev forgotten Fred!')

        # Always return a value to use as the new cleaned data, even if this method didn't change it
        return data

2.驗證相互依賴的字段

假設我們添加另外一個需求到聯(lián)系人表單中:如果cc_myself字段為True,那么subject必須包含單詞'help'.這個驗證包含多個字段,所以表單clean()方法是個不錯的地方.
注意,這里討論的是表單clean()方法,上面有提到一個字段clean()方法.區(qū)別字段和表單之間的差別非常重要,字段是單個數(shù)據(jù),表單是字段的集合.
在調(diào)用表單clean()方法的時候,所有字段的驗證方法已經(jīng)執(zhí)行完,所以self.cleaned_data填充的是目前為止已經(jīng)合法的數(shù)據(jù).所以需要記住一個事實,你需要驗證的字段可能沒有通過初始的字段檢查!

from django import forms

class ContactForm(forms.Form):
    # Everything as before
    ...
    def clean(self):
        cleaned_data = super(ContactForm, self).clean()
        cc_myself = cleaned_data.get('cc_myself')
        subject = cleaned_data.get('subject')

        if cc_myself and subject:
            # Only do something if both fields are valid so far.
            if 'help' not in subject:
                raise forms.ValidationError("Did not send for 'help' in the subject despite CC'ing yourself")

在這段代碼中贱枣,如果拋出驗證錯誤抖锥,表單將在表單的頂部顯示(通常是)描述該問題的一個錯誤信息浊吏。
注意子房,示例代碼中super(ContactForm, self).clean()的調(diào)用是為了保證維持父類中的驗證邏輯巩螃。

3.多表單提交的外鍵處理

假設有多個模型之間存在外鍵關系,那么在同一個頁面同時提交這幾個表單的處理方法:
建立幾個模型:

from django.db import models

class Store(models.Model):
    ...

class Deport(models.Model):
    s_name = models.ForeignKey(Store)
    ...

class Address(models.Model):
    s_name = models.ForeignKey(Store)
    ...

給這幾個模型分別建立模型表單.
由于其中兩個表使用了1個外鍵約束,如果同時提交和保存數(shù)據(jù)會導致數(shù)據(jù)表中的s_name_id字段值為NULL.為了解決這個問題,我們采用延遲提交給數(shù)據(jù)庫的方式.
ModelForm的save()方法接受一個可選的commit關鍵字參數(shù),其值為True/False.如果save()commit=False,那么它將返回一個還沒保存到數(shù)據(jù)庫的模型實例對象.這種情況下,你需要調(diào)用該返回的模型實例的save()方法.這樣你可以在保存數(shù)據(jù)之前進行一些自定義的處理.commit默認為True.

from django.views.generic.base import View

class Store_Add(View):
    ...
    def post(self, request):
        sf = StoreForm(request.POST)
        df = DeportForm(request.POST)
        af = AddressForm(request.POST)
        if sf.is_valid() and df.is_valid() and af.is_valid():
            store = sf.save()
            dform = df.save(commit=False)    # 將來自DeportForm的數(shù)據(jù)暫存為一個模型實例,其中s_name字段為空
            dform.s_name = store
            dform.save()
            aform = af.save(commit=False)
            aform.s_name = store
            aform.save()
        ...

4.從表單中訪問字段

可以通過表單fields屬性訪問字段:

#models.py
from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    website = models.URLField()

    def __str__(self):
        return self.name

#forms.py
from django import forms
from myapp.models import Publisher

class PublisherForm(forms.ModelForm):
    class Meta:
        model = Publisher
        fields = '__all__'

>>> form = PublisherForm()
>>> form.fields
# 返回一個有序字典對象,鍵為Form中的字段名,值為fields對象
OrderedDict([('name', <django.forms.fields.CharField at 0x1d075ebca90>),
             ('address', <django.forms.fields.CharField at 0x1d075ebcb38>),
             ('website', <django.forms.fields.URLField at 0x1d07696cc18>)])

可以使用字典的方法對Form的字段進行一些操作,例如:
form.fields.update({'website': forms.CharField(widget=forms.TextInput()})

后者動態(tài)的對某一個字段的屬性進行修改:
form.fields['website'].initial = self.request.user.website

fields對象的一些參數(shù)(屬性)參考文檔中的說明.



參考:http://python.usyiyi.cn/translate/django_182/ref/forms/validation.html#validating-fields-with-clean
???https://segmentfault.com/a/1190000007183873

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捧搞,一起剝皮案震驚了整個濱河市察净,隨后出現(xiàn)的幾起案子疆股,更是在濱河造成了極大的恐慌根资,老刑警劉巖架专,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件同窘,死亡現(xiàn)場離奇詭異,居然都是意外死亡部脚,警方通過查閱死者的電腦和手機想邦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來委刘,“玉大人丧没,你說我怎么就攤上這事锡移∨煌” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵淆珊,是天一觀的道長夺饲。 經(jīng)常有香客問我,道長施符,這世上最難降的妖魔是什么往声? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮操刀,結(jié)果婚禮上烁挟,老公的妹妹穿的比我還像新娘。我一直安慰自己骨坑,他們只是感情好撼嗓,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著欢唾,像睡著了一般且警。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上礁遣,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天斑芜,我揣著相機與錄音,去河邊找鬼祟霍。 笑死杏头,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的沸呐。 我是一名探鬼主播醇王,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼崭添!你這毒婦竟也來了寓娩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棘伴,沒想到半個月后寞埠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡焊夸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年仁连,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阱穗。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡怖糊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颇象,到底是詐尸還是另有隱情,我是刑警寧澤并徘,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布遣钳,位于F島的核電站,受9級特大地震影響麦乞,放射性物質(zhì)發(fā)生泄漏蕴茴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一姐直、第九天 我趴在偏房一處隱蔽的房頂上張望倦淀。 院中可真熱鬧,春花似錦声畏、人聲如沸撞叽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愿棋。三九已至,卻和暖如春均牢,著一層夾襖步出監(jiān)牢的瞬間糠雨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工徘跪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留甘邀,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓垮庐,卻偏偏與公主長得像松邪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子突硝,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容