2014-09-20 39 views
0

我使用Django 1.6與postgres。Django POST失敗日期格式驗證,即使input_formats

我已經設置DATE_INPUT_FORMATS,使用input_formats閱讀其他問題,並嘗試了好幾種組合,但起始日期字段仍處於驗證失敗有:

[u"'09/05/2014' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format."] 

我試圖改變USE_L10N爲False,隨着input_formats玩將模型從DateTimeField更改爲DateTime,甚至將格式添加到窗口小部件的形式都無濟於事。以下是當前設置。我覺得這是一個簡單的錯誤,但我無法弄清楚我做錯了什麼。我怎樣才能讓Django接受'09/05/2014'的輸入?

settings.py

TIME_ZONE = 'America/New_York' 
USE_I18N = True 
USE_L10N = True 
USE_TZ = True 

DATETIME_INPUT_FORMATS = ('%m/%d/%Y','%Y/%m/%d','%Y-%m-%d',) 
DATE_INPUT_FORMATS = ('%m/%d/%Y','%Y/%m/%d','%Y-%m-%d',) 

models.py

... 
class RecurringTransaction(models.Model): 
    user = models.ForeignKey(User) 
    amount = models.CharField(max_length=20) 
    account = models.ForeignKey(Account) 
    category = models.ForeignKey(Category) 
    interval = models.CharField(choices=INTERVAL_CHOICES, default="months", max_length=10) 
    occurrences = models.IntegerField() 
    start_date = models.DateTimeField() 
    end_date = models.DateTimeField(null=True, blank=True) 
    active = models.BooleanField(default=True) 
    repeats = models.IntegerField(choices=REPEAT_CHOICES, default=1) 
    end_type = models.IntegerField() 

forms.py

class RecurringTransactionForm(forms.ModelForm): 
    start_date = forms.DateField(input_formats=['%m/%d/%Y','%Y/%m/%d','%Y-%m-%d',]) 
    end_date = forms.DateField(required=False, input_formats=['%m/%d/%Y','%Y/%m/%d','%Y-%m-%d',]) 

    class Meta: 
     model = RecurringTransaction 
     fields = ('amount','category','interval','occurrences','start_date','end_date','active','repeats','end_type') 
     widgets = { 
      'interval': forms.Select(attrs={'class': 'form-control', 'id':'interval'}), 
      'repeats': forms.Select(attrs={'class': 'form-control', 'id':'repeats'}), 
      'category': forms.Select(attrs={'class': 'form-control', 'id':'category_id'}), 
     } 

views.py

... 
def add_edit_recurrence(request, id=None): 
    context = RequestContext(request) 

    if request.method == 'POST': 
     recurring_trx = RecurringTransaction.objects.filter(id=id).first() 
     recurring_trx_form = RecurringTransactionForm(request.POST, instance=recurring_trx) 
     #print recurring_trx_form.errors 

     if recurring_trx_form.is_valid(): 
      recurring_trx_form.save() 

    else: 
     recurring_trx_form = RecurringTransactionForm() 

return render_to_response("recurrence_new.html",{"recurring_trx_form":recurring_trx_form}, context) 

回答

0

你可以改變你的形式是這樣的:

class RecurringTransactionForm(forms.ModelForm): 

     ''' 
     I have added a class with each date/datetime field so that I could attach Jquery date picker to those classes.Its unnecessary if you don't need it. 
     ''' 
     def __init__(self,*args, **kwargs): 
      super(RecurringTransactionForm, self).__init__(*args, **kwargs) 
      self.fields['start_date'] = forms.CharField(widget=forms.TextInput(attrs={'class': 'date-selector'})) 
      self.fields['end_date'] = forms.CharField(widget=forms.TextInput(attrs={'class': 'date-selector'})) 


     def clean_start_date(self): 
      return datetime.datetime.strptime(self.cleaned_data['start_date'], '%m-%d-%Y') 
     def clean_end_date(self): 
      return datetime.datetime.strptime(self.cleaned_data['end_date'], '%m-%d-%Y') 


     class Meta: 
      model = RecurringTransaction 
      fields=['active', 'category',... ] #ignore start_date and end_date from this list 
+0

我試過,但它拋出一個類型的錯誤。 「必須是字符串,而不是datetime.date」所以strptime不能解析日期,但如果它得到日期,那麼我對第一個錯誤 – user2352879 2014-09-21 15:13:56

+0

更加困惑,你必須從Meta的字段中刪除start_date和end_date部分。我已經更新了我的回答 – ruddra 2014-09-21 15:21:27

+0

如果您收到日期,那麼只需忽略乾淨的方法@ user2352879 :) – ruddra 2014-09-21 16:03:55

0

您是否需要start_date作爲DatetimeField?...如果您要僅捕獲日期,請嘗試使用DateField。