2017-06-17 33 views
0

我想讓用戶設置它們在哪個時區,但是表單驗證.is_valid()失敗並且找不到原因。Django表單驗證失敗 - pytz和選項

  • 用戶的時區值存儲在Profile模型中。
  • 使用ChoiceFieldpytz.common_timezones填寫表單字段

這將似乎是做的相當簡單,唯一的事那是我平時的方式不同的是,填充組合數據/選擇框是使用ChoiceField,數據來自pytz

我可以切換到django-timezone-field來解決這個問題,但我想了解它爲什麼失敗。我在下面列出了所有相關的(我認爲)代碼。有什麼建議麼?

models.py

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    bio = models.TextField(max_length=500, blank=True) 
    location = models.CharField(max_length=30, blank=True) 
    birth_date = models.DateField(null=True, blank=True) 

    timezone = models.CharField(
     max_length=255, 
     blank=True, 
    ) 

forms.py

class ProfileEditForm(forms.Form): 

    profile_timezone = forms.ChoiceField(choices=[(x, x) for x in pytz.common_timezones]) 

views.py

@login_required 
def userprofile_edit(request): 

    if request.method == "POST": 
     profile_edit_form = ProfileEditForm() 

     if profile_edit_form.is_valid(): 
      cd = profile_edit_form.cleaned_data 

      user = User.objects.get(id=request.user.id) 

      user.profile.timezone = cd['timezone'] 
      user.profile.save() 

      messages.success(request, "Profile updated successfully", fail_silently=True) 
      return redirect('coremgr:userprofile', request.user.id) 

     else: 
      messages.error(request, "Error occured. Contact your administrator", fail_silently=True) 
      print "error: form not valid" 
    else: 
     profile_edit_form = ProfileEditForm() 

    context = { 
     'profile_edit_form': profile_edit_form, 
    } 

    return render(request, 'apps/coremgr/userprofile_edit.html', context) 

模板

<form name="formprofile" method="POST" action=""> 
{% csrf_token %} 

<p id="profile_timezone" class="form-inline"> 
{{ profile_edit_form.profile_timezone.errors }} 
Timezone: 
{{ profile_edit_form.profile_timezone }} 
</p> 

<button id="id_btn_profile_edit_save" type="submit" class="btn btn-default" tabindex=7>Save</button> 
</form> 

回答

0

添加request.POST形式

if request.method == "POST": 

    profile_edit_form = ProfileEditForm(request.POST) 
+0

唉唉哈哈....那麼明顯,不明白我怎麼錯過了!謝謝 :) – James

0

我相信你如果初始化塊的形式,當你需要在request.POST通過。