2016-12-10 1 views
0

Я потерялся здесь и не могу понять, что мне не хватает, что, вероятно, что-то глупо, но мне нужен еще один набор глаз, потому что насколько я может сказать, что это должно работать.Django form.save() не принимает обновленный form.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

Можете ли вы попробовать новое редактирование? Я внес серьезные изменения, потому что я чувствую, что первый ответ был неправильным. Поскольку вы «очищаете» и проверяете номер телефона, мы должны использовать специальную проверку. –