Django表单验证失败 - pytz和选择

时间:2017-06-17 04:07:23

标签: python django django-forms pytz django-timezone

我试图让用户设置他们所在的时区,但是表单验证.is_valid()失败并且无法弄清楚原因。

  • 用户的时区值存储在个人资料模型中。
  • 使用ChoiceFieldpytz.common_timezones填写表单字段

这看起来很简单,唯一不同于我常用的方法是填充组合/选择框的数据是使用ChoiceField并且数据来自{ {1}}。

我可能会切换到django-timezone-field来解决这个问题,但我想了解它失败的原因。我在下面列出了所有相关的(我认为)代码。有什么建议吗?

models.py

pytz

forms.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,
    )

views.py

class ProfileEditForm(forms.Form):

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

模板

@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)

2 个答案:

答案 0 :(得分:0)

我相信你需要在if块中初始化表单时传递request.POST。

答案 1 :(得分:0)

在表单中添加request.POST

if request.method == "POST":

     profile_edit_form = ProfileEditForm(request.POST)