【问题标题】:Django POST fails date format validation, even with input_formatsDjango POST 日期格式验证失败,即使使用 input_formats
【发布时间】:2014-11-15 00:38:32
【问题描述】:

我正在使用带有 postgres 的 Django 1.6。

我已阅读有关设置 DATE_INPUT_FORMATS 的其他问题,使用 input_formats 并尝试了几种组合,但 start_date 字段仍然无法验证:

[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)

【问题讨论】:

    标签: python django


    【解决方案1】:

    您需要将 start_date 作为 DatetimeField 吗?...如果您只想捕获日期,请尝试使用 DateField。

    【讨论】:

      【解决方案2】:

      您可以像这样更改表单:

      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
      

      【讨论】:

      • 我试过了,但它抛出了一个类型错误。 “必须是字符串,而不是 datetime.date” 所以 strptime 无法解析日期,但如果它正在获取日期,那么我对第一个错误更加困惑
      • 您必须从 Meta 的字段部分中删除 start_date 和 end_date。我已经更新了我的答案
      • 如果你要约会,那么请忽略干净的方法@user2352879 :)
      • 这行得通,感谢您的帮助。你能解释一下为什么只在模型表单字段上使用 input_formats 不起作用吗?
      • 我想可能是因为您在模型中使用了 datetimefield,并且它没有通过输入格式进行验证。
      猜你喜欢
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多