2012-02-23 6 views
4

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

это мои формы DateField запись (т.е. is_valid() возвращает ложь.): 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'] 

объекта дата не всегда Нет.

Что я делаю неправильно?

EDIT:

Это то, что я пытаюсь ввести: 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> 

это мой взгляд s.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) 
+0

Какую дату вы пытаетесь войти? –

+0

Покажите нам ввод. Покажите нам какой-либо не-полевой код, который у вас есть. Покажите нам соответствующий код просмотра. – Marcin

+0

Что такое settings.TIME_ZONE? –

ответ

6

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

+0

Подождите, как это решить проблему? У меня такая же проблема, я не указываю пользовательские форматы ввода, которые должны отступать от дефолтов. Дата все еще не проверяется. –

+1

это было для меня. 'date_of_birth = forms.DateField (label = u'date of birth ', input_formats = ['% d /% m /% Y ','% m /% d /% Y ',], required = False, widget = forms .DateInput (format = '% d /% m /% Y')) ' – xpanta

1

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

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

Вы можете в конечном итоге с чем-то DRY, как это (как fields, указанных в models.py не должны повторяться в forms.py):

class SomeForm(forms.Form): 

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