Ошибка проверки формы в Django - pytz и выборы

Я пытаюсь позволить пользователю установить, в каком часовом поясе он находится, однако проверка формы .is_valid() терпит неудачу и не может понять, почему.

  • Значение часового пояса для пользователя сохраняется в модели профиля.
  • С помощью ChoiceField а также pytz.common_timezones заполнить поле формы

Это может показаться довольно простым, единственное, что отличается от моего обычного способа, это то, что данные, заполняющие поле со списком / выбором, это использование ChoiceField и данные поступают из pytz,

Я могу переключиться на https://github.com/mfogel/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>

2 ответа

Решение

Добавлять request.POST сообщить

if request.method == "POST":

     profile_edit_form = ProfileEditForm(request.POST)

Я полагаю, вам нужно будет передать request.POST при инициализации формы в вашем блоке if.

Другие вопросы по тегам