真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python基礎(chǔ)教程:一次性搞定DjangoForm

最近在項目上用到了 Django 的自帶的 Form 表單,遇到了一些坑,今天給大家出的這篇 Python基礎(chǔ)教程 也是做了一個簡單的總結(jié),大家可以對號出坑。

成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站十載經(jīng)驗成就非凡,專業(yè)從事成都做網(wǎng)站、成都網(wǎng)站設(shè)計,成都網(wǎng)頁設(shè)計,成都網(wǎng)頁制作,軟文發(fā)布平臺1元廣告等。十載來已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:18982081108,我們期待您的來電!

Form 基礎(chǔ)介紹

首先讓我們先來了解下 Django 中 Form 表單的基本用法。Django 中提供了兩種 Form 表單類型,一種是 forms.Form ,另外一種是 forms.ModelForm 。很明顯,一種是普通的 Form 表單類型,另外一種是和 Model 有關(guān)聯(lián)的表單類型。官方文檔中是這樣來介紹 ModelForm 的:

If you’re building a database-driven app, chances are you’ll have forms that map closely to Django models. For instance, you might have a BlogComment model, and you want to create a form that lets people submit comments. In this case, it would be redundant to define the field types in your form, because you’ve already defined the fields in your model.

For this reason, Django provides a helper class that lets you create a Form class from a Django model.

Python基礎(chǔ)教程:一次性搞定 Django Form

對于 Django 中的 Form 表單的用法,我們只需要了解以下幾點(diǎn):

  • 它是一個定義一個 Form 類,基類是 django.forms.Forms 或者 django.forms.ModelForm ,在 view 中實例化定義好的 Form 類,在模板中使用 {{ form }} 即可自動生成對應(yīng)的 form 表單內(nèi)容。
  • ModelForm 比較簡單,它適用于:當(dāng)你創(chuàng)建的表單內(nèi)容與某個 Model 內(nèi)容很相似的情況。如上面文檔介紹的一樣
  • 在 Form 類中,clean 方法可以在做表單驗證,它是一個總的驗證方法。clean_xxx 是單個表單驗證方法,其中 xxx 是對應(yīng)的屬性名稱
  • form.clean_data 是會得到字典類型,key 是對應(yīng)屬性名,value 即為表單輸入的值
  • 生成的 form 標(biāo)簽,id 是有特殊規(guī)律的,我們可以通過這些 id 進(jìn)行一些 js 操作

    問題總結(jié)

    在這次項目需求中,我主要遇到的問題是,有幾個表單頁面,后臺使用同一張表去做存儲,但是每個頁面有許多變化的元素,如果為了存儲這些可變的值,每個元素都用數(shù)據(jù)庫一個字段去做存儲不太現(xiàn)實,因為需求是一直在變化的。所以我采用的解決辦法是提取公共的元素,其他可變的元素用了一個json字段存在數(shù)據(jù)庫中。

    而這樣導(dǎo)致的問題就是,不能使用 ModelForm ,我選擇了使用普通的 forms.Form 。這樣遇到了一些問題,總結(jié)如下:

    1 . forms.Form 的初始化

    有兩種初始化方式:

    # 第一種方式:
    # 初始化一個空的 form 表單,同時綁定頁面上的表單輸入值,即能接受頁面上的輸入值
    # 能接受頁面上的輸入值,這點(diǎn)很重要
    form = UserForm(request.POST or None, request.FILES or None)
    # 第二種方式:
    # 接受一個字典,做賦值初始化
    form = UserForm({'name': 'Demon', 'age': 8})
    

    基于這兩種做法,我很顯然的在 view.py 中寫出了這樣的代碼:

    def create_user(request):
     # 根據(jù)是否傳入 uid 來判斷是創(chuàng)建還是編輯
     uid = request.GET.get('uid', '')
     if uid:
     # 如果傳入了 uid ,查找當(dāng)前 uid
     account = Account.objects.filter(id=uid).first()
     # 封裝當(dāng)前 賬號 的信息,做表單初始化
     # 為了說明問題,不考慮 account 沒有找到的情況
     user_info = {
     'name': account.name,
     'age': account.age
     }
     # 表單初始化
     form = UserForm(user_info)
     else:
     # 如果是新建,則初始化一個空的表單
     form = UserForm(request.POST or None, request.FILES or None)
     if request.method == 'POST':
     if form.is_valid():
     # do save opertion
     pass
     return render(request, 'xxx/xxx.html', local())
    

    看上去一切安好,代碼也十分簡單。但問題來了,新建還行,但當(dāng)我們使用編輯的時候,會發(fā)現(xiàn),沒辦法做修改,即當(dāng)代碼走到 form.is_valid() 時,它始終做了 dict 的初始化,它不再會接受你新輸入的值。

    解決思路如下:

    每次都初始化一個空的 form ,前端渲染頁面時,用 js 去控制頁面的展示。這也比較簡單,這里不做多的說明。

    2 . 圖片格式編輯頁如何獲取之前展示的結(jié)果

    對于圖片,新建的時候上傳還比較簡單,問題是在于如果是編輯,如何帶回原來的上傳結(jié)果。我們都知道 是沒辦法賦值的。所以表單初始化的時候,也沒有辦法進(jìn)行賦值。

    解決思路如下:

    在表單中新開一個字段,用來存儲上傳后的圖片鏈接,當(dāng)圖片未上傳時,整個 div 隱藏,當(dāng)圖片有值時,整個 div 展示。后端通過判斷真正的 file 字段 與 url 字段,來判斷是否有新上傳文件

    3 . clean_xxx 方法未返回值時,form.clean_data[‘xxx’] 獲取不到值

    這是需要比較注意的一點(diǎn),我們可以通過寫 clean_xxx(self) 的方法,來對表單的某個屬性做校驗,但一旦校驗通過,注意一定要返回當(dāng)前輸入的值。正確示例如下:

    class UserForm(forms.Form):
     """用戶表單"""
     name = forms.IntegerField(label='姓名', required=True)
     age = forms.IntegerField(label='年齡', required=True, min_value=0)
     def clean_name(self):
     """name不超過20個字符"""
     name = self.cleaned_data.get('name')
     if not name:
     raise forms.ValidationError('請輸入姓名')
     if name and len(name) > 20:
     raise forms.ValidationError('長度不超過20')
     # 注意一定要返回輸入值,否則后端獲取不到輸入的值
     return account_id
    

    小結(jié)

    form.Forms 我還算是比較經(jīng)常用的,我覺得封裝了很多比較好的用法,比如限制必輸,限制最小值、最大值等。只要避免一些坑,就會比較得心應(yīng)手了。希望這次總結(jié)的坑,你沒有入!也歡迎大家的補(bǔ)充!更多的 Python基礎(chǔ)教程 也會繼續(xù)為大家更新!


    文章標(biāo)題:Python基礎(chǔ)教程:一次性搞定DjangoForm
    轉(zhuǎn)載源于:http://weahome.cn/article/gjjsdg.html

    其他資訊

    在線咨詢

    微信咨詢

    電話咨詢

    028-86922220(工作日)

    18980820575(7×24)

    提交需求

    返回頂部