2017-06-17 12 views
0

私はユーザーがタイムゾーンを設定できるようにしようとしていますが、フォームの検証は.is_valid()で失敗しており、理由を把握できません。Djangoフォームの検証に失敗しました - pytzと選択肢

  • ユーザーのタイムゾーン値は、プロファイルモデルに格納されます。
  • これを行うために非常に簡単であるように思われます

フォームフィールドを埋めるためにChoiceFieldpytz.common_timezonesを使用して、唯一のものは、私の通常の方法とは異なるthatsのコンボ/選択ボックスを埋めるデータがあるということです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

が....笑ああ形でそれほど明白

if request.method == "POST": 

    profile_edit_form = ProfileEditForm(request.POST) 
+0

request.POSTを追加し、私はそれを逃したか理解していません!ありがとうございました :) – James

0

は、私はあなたの場合はブロックでフォームを初期化する際にrequest.POSTに合格する必要があるだろうと信じています。

関連する問題