【问题标题】:["'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format."] will show up if I check for full_clean()["'%(value)s' 值的格式无效。它必须是 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 格式。"] 如果我检查 full_clean 会显示()
【发布时间】:2019-10-07 05:41:21
【问题描述】:

当我尝试使用 full_clean() 查看我的对象是否有效时出现以下错误。

django.core.exceptions.ValidationError: {'schedule_date': ["'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format."]}

我已经尝试了这里推荐的所有格式,但它们都不适合我:

Whats the correct format for django dateTime?

当我创建像 Object.objects.create(...) 这样的对象时,我不会出错

这是我的models.py

from datetime import datetime, timedelta, date
from django.db import models
from django import forms
from django.utils import timezone
from django.core.exceptions import ValidationError

from userstweetsmanager.constants import LANGUAGE_CHOICES

def password_validator(value):
    if len(value) < 6:
        raise ValidationError(
            str('is too short (minimum 6 characters)'),
            code='invalid'
        )

class User(models.Model):
    name = models.TextField(max_length=30, unique=True)
    password = models.TextField(validators=[password_validator])
    twitter_api_key = models.TextField(null=True, blank=True)
    twitter_api_secret_key = models.TextField(null=True, blank=True)
    twitter_access_token = models.TextField(null=True, blank=True)
    twitter_access_token_secret = models.TextField(null=True, blank=True)
    expire_date = models.DateField(default=date.today() + timedelta(days=14))
    language = models.TextField(choices=LANGUAGE_CHOICES, default='1')

def schedule_date_validator(value):
    if value < timezone.now() or timezone.now() + timedelta(days=14) < value:
        raise ValidationError(
            str('is not within the range (within 14 days from today)'),
            code='invalid'
        )

def content_validator(value):
    if len(value) > 140:
        raise ValidationError(
            str('is too long (maximum 140 characters)'),
            code='invalid'
        )

class Tweet(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField(validators=[content_validator])
    schedule_date = models.DateTimeField(validators=[schedule_date_validator])

这是我发生错误的测试代码:

    def test_valid_tweet(self):
        owner = User.objects.get(name="Hello")
        tweet = Tweet(user=owner, content="Hello world!", schedule_date=timezone.now())
        try:
            tweet.full_clean() # error occurs here
            pass
        except ValidationError as e:
            raise AssertionError("ValidationError should not been thrown")
        tweet.save()
        self.assertEqual(len(Tweet.objects.all()), 1)

当我测试在python manage.py shell中创建一个对象时,它会导致错误,但如果我在full_clean()中创建一个对象,则会导致错误。

【问题讨论】:

    标签: django validation datetime pytz


    【解决方案1】:

    问题在于代码的逻辑。我指定了在schedule_datetimezone.now() 中不允许有百万分之一秒差异的时间范围

    查看DateTimeField 的源代码后,似乎如果我让我的验证器抛出 code="invalid",它只会显示上述错误消息,这让我对我的代码在哪里感到困惑错了。

    【讨论】:

      【解决方案2】:

      我用这个解决了这个问题

      datetime.strptime(request.POST['date'], "%Y-%m-%dT%H:%M")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-26
        • 2018-06-07
        • 1970-01-01
        • 2019-02-02
        • 2023-02-23
        • 2015-02-26
        • 2019-01-05
        • 1970-01-01
        相关资源
        最近更新 更多