[Значение '% (value) s' имеет недопустимый формат. Должно быть указано в формате ГГГГ-ММ-ДД ЧЧ: ММ [: ss [.uuuuuu]] [TZ]. "], если я проверю full_clean() - PullRequest
0 голосов
/ 20 мая 2019

Я получаю следующую ошибку, когда пытаюсь проверить, допустим ли мой объект, используя 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(), это вызовет ошибку.

1 Ответ

1 голос
/ 21 мая 2019

Проблема была с логикой кода.Я указал временной интервал, который не допускает разницы даже в одну миллионную секунду в schedule_date и timezone.now()

После просмотра исходного кода DateTimeField кажется, что у меня естьvalidator, чтобы бросить code = "invalid", он просто покажет вышеупомянутое сообщение об ошибке, которое заставило меня запутаться, где мой код неправильный.

...