簡體   English   中英

["'%(value)s' 值的格式無效。它必須是 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 格式。"] 如果我檢查 full_clean 會顯示()

[英]["'%(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()

當我嘗試使用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."]}

我已經嘗試了這里推薦的所有格式,但它們都不適合我:

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() ,它會導致錯誤。

問題在於代碼的邏輯。 我指定的時間范圍不允許schedule_datetimezone.now()相差一百萬分之一秒

看完DateTimeField的源代碼后,似乎如果我的驗證器拋出code =“ invalid”,它將僅顯示以上錯誤消息,這使我對代碼錯誤之處感到困惑。

我用這個解決了這個問題

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM