Django 表单验证失败 - pytz 和选择
Django form validation failing - pytz and choices
我试图让用户设置他们所在的时区,但是表单验证 .is_valid()
失败并且无法找出原因。
- 用户的时区值存储在配置文件模型中。
- 使用
ChoiceField
和 pytz.common_timezones
填写表单字段
这看起来很简单,唯一与我通常的方法不同的是填充 combo/select 框的数据是使用 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>
我相信您在 if 块中初始化表单时需要传入 request.POST。
在表格
中添加 request.POST
if request.method == "POST":
profile_edit_form = ProfileEditForm(request.POST)
我试图让用户设置他们所在的时区,但是表单验证 .is_valid()
失败并且无法找出原因。
- 用户的时区值存储在配置文件模型中。
- 使用
ChoiceField
和pytz.common_timezones
填写表单字段
这看起来很简单,唯一与我通常的方法不同的是填充 combo/select 框的数据是使用 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>
我相信您在 if 块中初始化表单时需要传入 request.POST。
在表格
中添加request.POST
if request.method == "POST":
profile_edit_form = ProfileEditForm(request.POST)