<form action="/blog/" method="get">
如果runserver默認啟用127.0.0.1:8000的話,且上面這個form是在頁面127.0.0.1:8000/test上的表單,則它返回的url為127.0.0.1:8000/blog/,而下面的form返回的url為127.0.0.1:8000/test/blog/,區別是action的值不同。
<form action="blog/" method="post">{%csrf_stoken%}
djangobook2.0中說,在用戶瀏覽表單時,並沒有產生post數據,只有submit的時候才產生。
form表單中如果方法是get,則是把提交的信息附加在當前的url中返回。返回的值如果是url,則在當前url中action值添加,再找urlconf中所對應的views.py。如果是文件,則把表單信息返回到其文件中。而post方法,則是在views.py中以request.POST方法來取得表單所提交的信息。
CSRF verification failed錯誤
通過搜索,大部分給出的解決方法就是添加{%csrf_token%},然后在settings.py中添加上middleware。而網址http://www.qttc.net/201209211.html給出了一個比較全面的解決方法。他的思路值得學習,就是要自己去分析錯誤,根據錯誤的提示,找到對應的文檔,來獲得解決方法,而不是遇到錯誤就第一時間找百度(因為現在谷歌不好用...)
form框架把每一個field的顯示邏輯分離到一個獨立的widget中,每一個字段都有默認的widget。理解一下form負責數據校驗邏輯,而widget負責顯示邏輯。
表單做的第一件事情是把自己顯示成一個html。第二件事情是校驗數據,form需要綁定,然后校驗。每一個字段都有一個對應的錯誤,所有字段的錯誤組成了form框架自己的字典表。errors有.is_valid()方法,看是否滿足默認的required,還有自定義的clean_方法,相當於附加了自定義的校驗條件。form框架先執行valid的默認校驗,然后再執行自定義的clean_方法。那么如果滿足.is_valid()但是不滿足clean_的話,數據庫里存的是哪一個數據呢?看文檔中要求clean_方法最后一定要返回字段名(field),猜測是存放默認校驗后的數據,即使自定義校驗不滿足,也並不會擦除之前存的數據。需要自己檢驗一下。第三件事情是數據清理,就是調用.clean_data('字段名')的方法進行數據的清理,取出需要的數據,放進對應的models中。