its-django / mysite

<<It's Django - 用Python迅速打造Web應用>> 書中程式碼
Apache License 2.0
48 stars 25 forks source link

p.196 forms.py 中 "return content" 的疑惑 #18

Open youthhng opened 7 years ago

youthhng commented 7 years ago

您好:

對於 p.196的 forms.py 的 "return content" ,我有一些疑惑:

#-*- coding: utf-8 -*-
from django import forms

class CommentForm(forms.Form):
    visitor = forms.CharField(max_length=20)
    email = forms.EmailField(max_length=20, required=False, label='E-mail')
    content = forms.CharField(max_length=200, widget=forms.Textarea())

    def clean_content(self):
        content = self.cleaned_data['content']
        if len(content) < 5:
            raise forms.ValidationError('字數不足')
        return content

我的預期是: (1) 呼叫 f.content ,會回傳 content = forms.CharField(max_length=200, widget=forms.Textarea()) 的結果 (2) 要特地呼叫 f.clean_content ,才會回傳 clean_content() 裡的結果;或是透過撰寫 def init(self, content) 的方式來達成。

但從 p.198 頁的結果來看,似乎直接呼叫前者,就可以達成後者的需求......

因為對 python 和 django 都還不是很熟悉,所以想問一下這個基本的問題......感謝!

myyang commented 7 years ago

@youthhng

這個是兩個不一樣的東西

在p.196中是在驗證form裡面的資料,而django會先把form裡"clean",而這裡就可以讓使用者自己擴展或複寫進行自定義的操作,而form中合法(valid)的資料則都會被集中到cleaned_data讓之後續使用不需煩惱資料的處理或驗證,因為從clened_data拿到的值就是由form處理或驗證過的合法資料

但在P.198我們是在template中"畫"出要給使用者看的網頁,而處理這件事的則是模版引擎(template eninge),當我們把form傳到版中,其他也是拿到你用f.content拿到的forms.CharField,但經由引擎解析其中的欄位(如 initial,widget…)畫出相對的html元素

youthhng commented 7 years ago

感謝您的回覆!

搭配上您的解說,現在我比較了解p.196上半段的 "clean_表單欄位" 和下半斷的說明了~