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

Posted

技术标签:

【中文标题】Django 表单验证失败 - pytz 和选择【英文标题】:Django form validation failing - pytz and choices 【发布时间】:2017-11-19 21:42:08 【问题描述】:

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

用户的时区值存储在 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>

【问题讨论】:

【参考方案1】:

在表格中添加request.POST

if request.method == "POST":

     profile_edit_form = ProfileEditForm(request.POST)

【讨论】:

啊哈哈....太明显了,不明白我是怎么错过的!谢谢你:)【参考方案2】:

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

【讨论】:

以上是关于Django 表单验证失败 - pytz 和选择的主要内容,如果未能解决你的问题,请参考以下文章

Django - 403 禁止 CSRF 验证失败

Django“自动对焦”表单验证错误

jQuery 和 Django 表单验证重新加载和提交事件监听器

Django - 禁用表单选择字段验证

使用Ajax验证并提交Django表单(django-crispy-forms)

Django,自定义身份验证登录。身份验证失败时如何显示错误消息?