2016-12-10 43 views
0

我迷失在這裏,無法弄清楚我錯過了什麼,這可能是愚蠢的,但我需要另一組眼睛,因爲就我而言可以告訴這應該工作。Django form.save()沒有采取更新的形式.cleaned_data

我想要做的是允許我的用戶以他們習慣看到的方式輸入電話號碼,但是接着輸入並從Twilio獲取經過驗證的國際電話號碼並保存。根據定義,這意味着它會在以下格式 - 這是我需要有它的數據庫,以便與應用程序的其他部分進行交互以及格式:

+17085551212 

我已經調試到如此地步在那裏我知道值是正確的,一切正常,如果我得到一個無效的數字,等等。出於某種原因,更新後的值不會被傳回到窗體,當我設置form.cleaned_data ['office_phone']之前form.save()。所以我得到數據庫中的原始數字(708)555-1212。

forms.py

class ProfileForm(forms.ModelForm): 
    office_phone = forms.CharField(max_length=20, label="Office Phone") 

views.py

if form.is_valid(): 
    print (form.cleaned_data['office_phone']) 
    pn = form.cleaned_data['office_phone'].replace(" ","") 
    try: 
     response = validator.phone_numbers.get(str(pn)) 
     form.cleaned_data['office_phone'] = str(response.phone_number) 
     print form.cleaned_data 
     form.save() 
     success_message = "Your changes have been saved" 
    except: 
     error_message = "The contact phone number you entered is invalid." 

console.output

(708) 555-1212 
+17085551212 
+17085551212 
{'office_phone': '+17085551212'} 
<tr><th><label for="id_office_phone">Office Phone:</label></th> 
<td><input id="id_office_phone" maxlength="20" name="office_phone" type="text" value="(708) 555-1212" /></td></tr> 

缺少什麼我在這裏?

回答

1

做了編輯:我意識到,而不是覆蓋save,我們應該將清潔/使用自定義驗證驗證電話號碼:

class ProfileForm(forms.ModelForm): 
    office_phone = forms.CharField(max_length=20, label="Office Phone") 

    def clean_office_phone(self): 
     value = self.cleaned_data.get("office_phone") 
     try: 
      value = value.replace(" ", "") 
      response = validator.phone_numbers.get(str(value)) 

     except: 
      raise ValidationError("The contact phone number you entered is invalid") 

     return str(response.phone_number) 

views.py

if form.is_valid(): 
     form.save() 
     success_message = "Your changes have been saved" 
+0

這將如何處理一個錯誤的情況下,如果驗證器返回404(無效的電話號碼),而不是返回有效的電話號碼? 另外,不知道我理解的 '如果承諾: instance.save() 回報instance' 反正嘗試過了,現在它甚至不似乎保存更改。是的,保存總是失敗。去嘗試解決它,但不知道。 – f71316

+0

解決上述問題,並得到它的工作,但仍不明白爲什麼。你能解釋爲什麼在這裏工作,而不是在視圖中有工作代碼? – f71316

+0

你可以嘗試新的編輯?我做了重大改變,因爲我覺得第一個答案不是正確的路要走。由於您正在「清理」並驗證電話號碼,因此我們應該使用自定義驗證。 –