django формы dateField не проходит проверку - PullRequest
4 голосов
/ 23 февраля 2012

Я пытаюсь проверить форму профилирования пользователя в django и не могу. Похоже, что-то не так с forms.dateField (). Он не проверяет (т.е. is_valid () возвращает false)

это моя форма dateField: date_of_birth = forms.DateField(label=u'date of birth', input_formats='%d/%m/%Y', required=False, widget=forms.DateInput(format = '%d/%m/%Y'))

Я заметил, что request.POST.get('date_of_birth', '') возвращает правильную дату (т.е. дату, которую я ввел в поле формы html).

Я также заметил, что в этой функции:

def clean_date_of_birth(self):
    date = self.cleaned_data['date_of_birth']

объект даты всегда None.

Что я делаю не так?

РЕДАКТИРОВАТЬ:

Это то, что я пытаюсь ввести: 29/07/1974 (29 июля 1974 г.)

Это вывод 'submit' (различные запросы)

29/07/1974
profile form is *NOT* valid
[23/Feb/2012 12:16:27] "POST /profile/chris/ HTTP/1.1" 200 16289

29/7/1974
profile form is *NOT* valid
[23/Feb/2012 12:16:33] "POST /profile/chris/ HTTP/1.1" 200 16289

1974-07-29
profile form is *NOT* valid
[23/Feb/2012 12:18:15] "POST /profile/chris/ HTTP/1.1" 200 16289

Это мой шаблон

    <div class="input_area">
        <form id="profile_form" method="post" action="/profile/{{ user.username }}/">{% csrf_token %}
            {{ form.as_p }}
            <input type="submit" id="submit" value="save" class="submitButton idle" style="width:70px" />
        </form>
    </div>

это мои views.py

def profile(request, username):
    form = ProfileForm(request.POST)
    print request.POST.get('date_of_birth', 'None')
    try:
        user = User.objects.get(username=username)
    except User.DoesNotExist:
        raise Http404(u'User not Found')
    if form.is_valid():
        print 'profile form is valid'
    else:
        print 'profile form is *NOT* valid'

и, наконец, это мой forms.py (на данный момент не используйте функции clean_data)

class ProfileForm(forms.Form):

    tz = []
    timezones = Timezone.objects.all()
    for timezone in timezones:
        val = str(timezone.hour)
        v = val.split(':')
        tuple = (timezone.id, '('+timezone.sign+''+v[0]+':'+v[1]+') '+timezone.name)
        tz.append(tuple)

    sex = [('male','male'),('female', 'female'),('unknown', 'prefer not to say')]
    real_name = forms.CharField(label=u'real name', widget=forms.TextInput, required=False)
    date_of_birth = forms.DateField(label=u'date of birth', input_formats='%d/%m/%Y', required=False, widget=forms.DateInput(format = '%d/%m/%Y'))
    pp_email = forms.EmailField(label=u'Paypal Email', widget=forms.TextInput, required=False)
    gender = forms.ChoiceField(label=u'sex', choices=sex, widget=forms.Select(), required=False)
    timezone = forms.ChoiceField(label=u'time zone', choices=tz, widget=forms.Select())
    address = forms.CharField(label=u'street address', widget=forms.Textarea, required=False)
    postal  = forms.CharField(label=u'postal code', widget=forms.TextInput, required=False)

Ответы [ 2 ]

6 голосов
/ 23 февраля 2012

форматы ввода в DateField должны быть списком или кортежем https://docs.djangoproject.com/en/dev/ref/forms/fields/#django.forms.DateField.input_formats

1 голос
/ 24 марта 2014

С Django 1.6 и выше вы можете использовать localized_fields в мета-форме вашей формы или localize=True в вашей форме. Смотри https://docs.djangoproject.com/en/1.9/topics/i18n/formatting/#format-localization.

При использовании USE_L10N = True Django будет использовать файл formats.py для вашей локали (часть LANGUAGE_CODE).

Вы можете получить что-то СУХОЕ, как это (так как fields, указанный в models.py, не нужно повторять в forms.py):

class SomeForm(forms.Form):

    class Meta:
        model = SomeModel
        fields = ('first_name', 'dob',)
        localized_fields = ('dob',)
...